• 2022-08-20 数据库连接池


    Connection是一种稀有资源,一个连接建立就创造了一个资源。

    举个例子:

    QQ连接上了,我的QQ和腾讯的服务器建立了一个连接,有代价,因为需要远程的去连接,所以说连接是一个很宝贵的资源,如果同时在线人数很多就有可能导致服务器崩溃。

    所以就有两种情况(解决方案):

    第一种:我一个人玩(我自己一个服务器),那肯定不会崩溃。

    第二种:把服务器的人数限定一下,限定10000个人,最多不超过10000人,第10001个人上线,就需要排队。

    那我们使用JDBC到时候是必须要使用连接池的:

    JDBC使用数据库连接池的必要性:

    在使用基于web程序的数据库的连接,在主程序中建立连接,执行sql,断开连接

    所有的JDBC连接通过DriverManager.Connection连接.

    我们用完的连接不要被垃圾回收,能够重复使用

    所以需要“池化思想

    我们每次去初始化一个连接池,连接池中会有很多个连接在等待被使用。

    使用完连接之后,也不需要关闭连接,只需要把连接还回到连接池。

    还回到连接池的操作还不需要我们手动控制。

    初始化连接池,10条连接,来了20个请求,10个请求就直接拿走10条连接去进行操作,剩下的10个请求,有两种方式:一:等待前面10个请求结束,拿来用。二:我再向服务器申请连接数。

    连接池的数据池:

    (1)C3P0:二代数据库连接池,太老了,不学

    (2)DBCP:二代数据库连接池,太老了,不学

    (3)Druid:(德鲁伊)数据库连接池,现在市面上最好用的连接池。

                    阿里巴巴开源平台上的一个数据库连接池的实现,整合了C3P0和DBCP各自的优点

                    加入了日志监控,可以监控sql语句的执行情况

    (4)Hikari(光),目前最快的连接池。springboot默认的连接池。

    用数据池的前提:必须要有对应的属性文件和导入jar包

    .properties文件

    约定 > 配置 > 编码

    例如:德鲁伊数据库连接池

    druid.properties文件:(和之前写的jdbc.properties文件里的内容不一样)需要把mysql改成druid:

    1. druid.url=jdbc:mysql://127.0.0.1:3306/wy?useUnicode=true&characterEncoding=utf8
    2. druid.username=root
    3. druid.password=root
    4. druid.driverName=com.mysql.jdbc.Driver
    5. druid.initialSize=10//初始化链接数
    6. druid.maxActive=20//最大连接数
    7. druid.maxWait=20//获取连接最大等待时间

    在方法中:

    1. Properties properties = new Properties(); properties.load(Ch01.class.getClassLoader().getResourceAsStream("druid.properties"));
    2. //创建一个properties对象,拿到文件信息,加载到对象当中。
    3. //之后创建一个德鲁伊文件数据源:
    4. DruidDataSource druidDataSource = new DruidDataSource();
    5. //直接加载属性文件
    6. druidDataSource.configFromPropety(properties);
    7. //从数据库连接池中拿连接
    8. druidDataSource.getConnection();

    HikariConfig光数据库连接池:

    hikari.properties文件:

    1. jdbcUrl=jdbc:mysql://127.0.0.1:3306/wy?useUnicode=true&characterEncoding=utf8
    2. username=root
    3. password=020323
    4. driverClassName=com.mysql.jdbc.Driver

    方法调用: 

    1. Properties properties = new Properties();
    2. properties.load(Ch01.class.getClassLoader().getResourceAsStream("hikari.properties"));
    3. HikariConfig hikariConfig = new HikariConfig(properties);
    4. HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
    5. hikariDataSource.getConnection();

    利用数据库连接池(德鲁伊)做一个工具类(操作数据源)

    java提供的一个标准接口:DataSource

    目的:为了获取数据源(不用写那些文件等),再去获取连接,连接不需要关闭

    1. public class BaseDao {
    2. public static final DataSource DATA_SOURCE;
    3. static {
    4. Properties properties = new Properties();
    5. try { properties.load(Ch01.class.getClassLoader().getResourceAsStream("druid.properties"));
    6. // 创建德鲁伊的数据源,德鲁伊提供的一个静态方法
    7. DATA_SOURCE = DruidDataSourceFactory.createDataSource(properties);
    8. } catch (IOException e) {
    9. throw new RuntimeException(e);
    10. } catch (Exception e) {
    11. throw new RuntimeException(e);
    12. }
    13. }
    14. public static void closeAll(Statement stmt, ResultSet rs) {
    15. if(Objects.nonNull(stmt)) {
    16. try {
    17. stmt.close();
    18. } catch (SQLException e) {
    19. throw new RuntimeException(e);
    20. }
    21. }
    22. if(Objects.nonNull(rs)){
    23. try {
    24. rs.close();
    25. } catch (SQLException e) {
    26. throw new RuntimeException(e);
    27. }
    28. }
    29. }
    30. }

    我简要说明一个东东,因为博主也不是很理解,所以写的不对,请大家矫正:

    我们未来写项目的时候,会使用封装的思想,采用接口的形式,把一个一个类共同的连接方法通过接口的方式完成eg:

    有Teacher类和User类封装基础属性,然后之前我们的方式是通过XXXDao来写关于自己本类的方法,但是现在我们可以通过IBaseDao接口设置基础方法,再通过BaseDaoImpl实现接口补全方法内容,之后XXXDao继承BaseDaoImpl,这样我们不需要再XXXDao里面写方法,就可以调用连接。由于代码过多,我就不写了,有需要的可以私信我。

    DBUtils:

    使用的是一个类:QueryRunner:

    类传入的是数据源DataSource,不是一个Connection

    1. QueryRunner runner = new QueryRunner(BaseDao.DATA_SOURCE);
    2. //修改
    3. runner.update("update teacher set name = ? where id = ?", "mmm", 6);
    4. runner.query("select * from 表名 where id = ?",new BeanHandler<>(类名.class),1);
    5. //查询一个
    6. runner.query("",new BeanHandler)
    7. //查询所有
    8. runner.query("sql语句",new BeanListHandler<>(类名.class));
  • 相关阅读:
    if _name_ == “__main__“:NameError: name ‘_name_‘ is not defined
    镜面不锈钢氮气柜主要功能和应用领域介绍
    JSON文件读写
    Redis 6学习笔记(上)
    去耦电路设计应用指南(四)电源 PDN 配置
    【leetcode】回文子字符串的个数
    哪些电商平台的 API 很好用?为什么?
    面试面到了一个腾讯30k出来的,有见识到何为精通MySQL调优
    SpringBoot整合RabbitMQ
    腐蚀和膨胀
  • 原文地址:https://blog.csdn.net/weixin_49627122/article/details/126441346