写点什么

数据库连接池 -Druid 源码学习(八)

作者:wjchenge
  • 2022 年 5 月 18 日
  • 本文字数:795 字

    阅读完需:约 3 分钟

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; }}
复制代码


发布于: 刚刚阅读数: 2
用户头像

wjchenge

关注

还未添加个人签名 2018.07.27 加入

还未添加个人简介

评论

发布
暂无评论
数据库连接池 -Druid 源码学习(八)_Druid_wjchenge_InfoQ写作社区