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