2022-07-20 为什么要用连接池?

相信学过jdbc的童鞋应该都对如下代码比较熟悉;

   public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获取连接
        Connection conn = DriverManager.getConnection(  "jdbc:mysql://localhost:3306/test?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&maxReconnects=100&failOverReadOnly=false&initialTimeout=10&zeroDateTimeBehavior=convertToNull","root","" ); //(url,user,password)
        //获取操作数据库的预处理对象
        PreparedStatement pstem = conn.prepareStatement("select * from student1");
        //执行SQL,得到结果集
        ResultSet rs = pstem.executeQuery();
        //遍历结果集
        while(rs.next()) {
            System.out.println(rs.getString("name"));
        }
        //释放资源
        rs.close();
        pstem.close();
        conn.close();
    }

这是啥? 打开数据库链接,然后进行一次执行sql操作,然后关闭链接释放资源对吧? 有了这个util,我们就会方便很多,每次用java执行sql,都需要调用这个工具类即可,1 获取一个链接,执行sql 2 关闭链接;
但是实际上,这种经常开关链接的方式,其实是很浪费性能/资源的,频繁的开关比执行sql浪费的时间.性能要高得多!!!

于是连接池应运而生;
常见的连接池有 c3p0 boot项目默认支持的Hikari 以及阿里巴巴连接池 那么为什么用了连接池可以提升性能,是怎么提升的呢?

用了连接池的性能提升原因是,不在频繁开关数据库链接了;
提升关键是: 连接池在服务启动的时候,就开启了一定数量的链接,根据配置的数量开启,然后一直维护着这些链接,存储在连接池中,每次java程序执行sql,都会去连接池中取到一个链接,执行,然后并不调用close释放该链接,而是将 该链接重新放回连接池中,这样就不会频繁开关数据库的链接了;这就是连接池的工作原理;

连接池常用的配置参数一览; 这些参数其实不是随便配置的,都是有参考标准的;
以druid阿里巴巴 数据库连接池组件为例。

spring:
  datasource:
#   数据源基本配置
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_crud
    type: com.alibaba.druid.pool.DruidDataSource
#   数据源其他配置
    druid:
#     配置初始化大小、最小、最大线程数
      initialSize: 5
      minIdle: 5
#     CPU核数+1,也可以大些但不要超过20,数据库加锁时连接过多性能下降
      maxActive: 20
#     最大等待时间,内网:800,外网:1200(三次握手1s)
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
#     配置一个连接在池中最大空间时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1 
      testWhileIdle: true
#     设置从连接池获取连接时是否检查连接有效性,true检查,false不检查
      testOnBorrow: true
#     设置从连接池归还连接时是否检查连接有效性,true检查,false不检查
      testOnReturn: true
#     可以支持PSCache(提升写入、查询效率)
      poolPreparedStatements: true
#   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙  
      filters: stat,wall,log4j
#     保持长连接
      keepAlive: true
      maxPoolPreparedStatementPerConnectionSize: 20
      useGlobalDataSourceStat: true  
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    

你可能感兴趣的:(2022-07-20 为什么要用连接池?)