1、简介
在本文中,我们将测试 Druid 连接池配置参数 testOnReturn 的作用。
2、环境
os-window10
druid-1.2.8
jdk-1.8.0_312
maven-3.8.1
复制代码
3、配置 testOnReturn 运行效果
3.1、启动测试类
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://ip:port");
dataSource.setUsername("name");
dataSource.setPassword("password");
dataSource.setTestOnReturn(true);
dataSource.setValidationQuery("select 'x'");
while (true) {
try (DruidPooledConnection connection = dataSource.getConnection()) {
System.out.println("获取到连接 = " + connection);
} finally {
TimeUnit.SECONDS.sleep(5);
}
}
复制代码
3.2、打印 1 次 获取到连接 = xxx 后断开电脑网络,系统休眠 5 秒后,还能在连接池中拿到连接,再过 5 秒后,系统再次在连接池中获取连接时才会获取不到连接,打印错误日志。
以上结果符合预期,testOnReturn 参数说明:归还连接时执行 validationQuery 检测连接是否有效,第一次归还连接时检查连接有效可以归还成功,第二次归还连接时由于网络已断开所以会产生异常。
3.3、源码分析
关闭连接时会调用 com.alibaba.druid.pool.DruidDataSource#recycle 方法
if (testOnReturn) {
// 验证连接可用性
boolean validate = testConnectionInternal(holder, physicalConnection);
// 连接不可用逻辑
if (!validate) {
// 关闭物理连接
JdbcUtils.close(physicalConnection);
// com.alibaba.druid.pool.DruidAbstractDataSource.destroyCount 属性原子+1
destroyCountUpdater.incrementAndGet(this);
lock.lock();
try {
// 将连接的活动属性置为false
if (holder.active) {
activeCount--;
holder.active = false;
}
closeCount++;
} finally {
lock.unlock();
}
return;
}
}
复制代码
评论