1. 简介
1.1 基础
Druid是阿里的开源项目,是一个功能强大的数据库连接池。
1.2 连接池运行原理
1)数据库连接池在初始化的时候会创建initialSize个连接,当有数据库操作时,会从池中取出一个连接; 如果当前池中正在使用的连接数等于maxActive,则会等待一段时间,等待其他操作释放掉某一个连接, 如果这个等待时间超过了maxWait,则会报错; 如果当前正在使用的连接数没有达到maxActive,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。 在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。
2)同时连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。 如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后仍然没有使用,则被物理性的关闭掉。 有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况, 这时候设置一个testWhileIdle参数为true,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建, 最大情况的保证从连接池中得到的Connection对象是可用的。当然,为了保证绝对的可用性,你也可以使用testOnBorrow为true(即在获取Connection对象时检测其可用性),不过这样会影响性能。
2. 基础配置
driver-class-name | 驱动包名称 |
---|
url | 数据库连接url | username | 用户名 | password | 密码 | type | 数据库连接池类型(一般会自动根据url识别) |
3. DruidDataSource详细配置
3.1 连接池初始化
配置项 | 解释 |
---|
initial-size | 初始化连接池时的连接数量 | max-active | 最大连接数(就是常说的maxPoolSize) | min-idle | 最小连接数(就是常说的minPoolSize) |
3.2 连接(连接池中的)
配置项 | 解释 (单位都是毫秒) |
---|
max-wait | 从池中获取连接的最大等待时间 | time-between-eviction-runs-millis | 检查空闲连接的间隔 | min-evictable-idle-time-millis | 最小空闲,一个空闲连接至少可以保持该时间(超过就检测关闭) | max-evictable-idle-time-millis | 最大空闲,一个空闲连接超过该值会被杀掉(超过就强制关闭) |
3.3 连接的检测
配置项 | 解释 |
---|
validation-query | 检测连接存活时的 sql语句 | test-on-borrow | 服务向连接池申请连接时,检查该连接是否有效。高并发情况下, 这个动作相当消耗性能 | test-on-return | 当连接使用完之后,回收的时候会判断该连接是否还可用 | test-while-idle | 该参数只有在testOnBorrow是false时,60s检查一次空闲的连接是否有效 | filters | 监控统计拦截的filters ( stat是统计,wall是SQL防火墙,防SQL注入的,log4j是用来输出统计数据) |
3.4 其他(监控、记录…)
配置项 | 解释 |
---|
connectionProperties | druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 记录慢SQL |
4. 定时查看连接池状态
@Scheduled(cron = "0/50 * * * * ?")
public void logPoolStatus(){
System.out.println(new LocalDateTime() + "----- druid连接池状态 ");
for (Map.Entry<String, Object> entry : DruidStatManagerFacade.getInstance().getDataSourceStatDataList().get(0).entrySet()) {
System.out.println(entry.getKey() + " :" + entry.getValue());
}
}
注意点:
- ActiveCount + PoolingCount = 连接池当前所有的连接总数
Identity :1495761010
Name :DataSource-1495761010
DbType :mysql
DriverClassName :com.mysql.cj.jdbc.Driver
URL :jdbc:mysql://10.165.78.1:23307/octopus_workflow_ox2e?characterEncoding=utf-8&useSSL=false
UserName :local_octopus_workflow_m9xv
FilterClassNames :[com.alibaba.druid.filter.stat.StatFilter, com.alibaba.druid.wall.WallFilter, com.alibaba.druid.filter.logging.Log4j2Filter]
WaitThreadCount :0
NotEmptyWaitCount :0
NotEmptyWaitMillis :0
PoolingCount :5 当前连接池中的连接数(注意:不包括已经被借走的连接)
PoolingPeak :5
PoolingPeakTime :Thu Apr 28 11:52:30 CST 2022
ActiveCount :0 正在被使用的连接数(也就是被借走的)
ActivePeak :2
ActivePeakTime :Thu Apr 28 11:52:43 CST 2022
InitialSize :5
MinIdle :5
MaxActive :20
QueryTimeout :0
TransactionQueryTimeout :0
LoginTimeout :0
ValidConnectionCheckerClassName :com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker
ExceptionSorterClassName :com.alibaba.druid.pool.vendor.MySqlExceptionSorter
TestOnBorrow :false
TestOnReturn :false
TestWhileIdle :true
DefaultAutoCommit :true
DefaultReadOnly :null
DefaultTransactionIsolation :null
LogicConnectCount :45
LogicCloseCount :44
LogicConnectErrorCount :0
PhysicalConnectCount :6
PhysicalCloseCount :0
PhysicalConnectErrorCount :0
DiscardCount :1
ExecuteCount :86
ExecuteUpdateCount :33
ExecuteQueryCount :53
ExecuteBatchCount :0
ErrorCount :0
CommitCount :59
RollbackCount :0
PSCacheAccessCount :86
PSCacheHitCount :56
PSCacheMissCount :30
StartTransactionCount :39
TransactionHistogram :[J@63504592
ConnectionHoldTimeHistogram :[J@7fe9dae7
RemoveAbandoned :true
ClobOpenCount :0
BlobOpenCount :6
KeepAliveCheckCount :0
KeepAlive :false
FailFast :false
MaxWait :60000
MaxWaitThreadCount :-1
PoolPreparedStatements :true
MaxPoolPreparedStatementPerConnectionSize :20
MinEvictableIdleTimeMillis :300000
MaxEvictableIdleTimeMillis :600000
LogDifferentThread :true
RecycleErrorCount :0
PreparedStatementOpenCount :30
PreparedStatementClosedCount :0
UseUnfairLock :false
InitGlobalVariants :false
InitVariants :false
5.连接池原理详解(转自某大佬的详细整理)
https://blog.csdn.net/jb84006/article/details/119979999
|