1、简介
在本文中,我们将测试 Druid 连接池配置参数 testOnReturn 的作用。
2、环境
os-window10druid-1.2.8jdk-1.8.0_312maven-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; }}
复制代码
评论