1.数据库连接池

Java连接数据库有很多中方式,最原始的方式就是直接使用数据库驱动连接数据库,但是这种方式有很多的弊端,如每次执行sql都需要创建和关闭数据库连接器,需要消耗大量的资源,如果没关闭成功还会导致内存泄漏的问题,以及一些线程问题。而数据库连接池主要做的是,预先创建好一定量的数据库连接放到池子中,当需要执行sql语句的时候取出一个数据库连接执行sql语句,用完了放回去,如果系统关闭则断开所有的数据库连接,并释放内存。

2.常见的数据库连接池

  • HikariCP
    Hikari主打高性能高效率,SpringBoot默认的数据库连接池使用的就是HikariCP。
    他的优点在于:
    有精简的字节码(代码量比较少);
    优化了代理和拦截器;
    定义了集合类型:ConcurrentBag提高并发读写效率。
  • Druid
    Druid是Alibaba的一个开源的数据库连接池,官方自称Java最好的数据库连接池。Druid集成了强大的监控功能(SQL、Web、Session等等)、黑白名单拦截等。
  • DBCP、C3P0
    这俩款用的好像比较少,就不多介绍了。

3.Druid参数设置

1)Max-active:指的是连接池里允许的最大活跃连接数,这个值根据应用实际情况调整。
2)Min-idle:关掉多余连接,保留有效连接,节省数据库的资源,这个值根据应用实际情况调整。
3)Max-wait,指应用线程等待连接的超时。可以配几秒范围,根据业务应用实际情况进行判定。
4)Validation-query,指的是连接池探测当前连接是否是健康的SQL语句。如果是较新的JDBC,不会发SQL语句,而是发Ping命令。
5)Validation-query-timeout,指的就是探测超时的时间。
6)Test-on-borrow指连接从连接池里取出时,连接池是否需要对连接进行健康探测。建议关闭False。
7)Test-on-return,建议关闭False。
8)Test-while-idle,指的是控制当连接处于空闲状态时,是否需检测连接的健康状态。建议打开True。
9)Time-between-eviction-runs-millis指的是触发空闲连接健康探测阈值,需要跟上面的Test-while结合起来。
10)Remove-abandoned,泄露连接强制回收,默认是False关闭。
11)Remove-abandoned-timeout,指的是强制回收的触发时间阈值。配置时间不要太短,因为业务长时间使用连接,所以超时时间要比业务实际合理时间要高。配置参数单位是“秒”。
12)Log-abandoned,指的是关闭被泄露连接时输出堆栈。当一个连接被探测为连接泄露且强制关闭的时候,是否要

实例:

spring:
  datasource:
    druid:
      filter:
        slf4j:
          enabled: true
        stat:
          log-slow-sql: true
          merge-sql: true
          slow-sql-millis: 3000
        wall:
          config:
            delete-allow: true
            drop-table-allow: false
          enabled: true
      filters: stat,wall,slf4j
      initial-size: 10
      max-active: 100
      max-pool-prepared-statement-per-connection-size: 20
      max-wait: 30000
      min-evictable-idle-time-millis: 300000
      max-evictable-idle-time-millis: 600000
      min-idle: 10
      pool-prepared-statements: true
      keep-alive: true
      stat-view-servlet:
        enabled: true
        login-password: druid123
        login-username: druid
        url-pattern: /druid/*
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      time-between-eviction-runs-millis: 2000
      validation-query: SELECT 1
      validation-query-timeout: 30000
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource