Druid数据库连接池 #8 连接池检测

1,214 阅读2分钟

又是加班的一个晚上,这篇又要水一下了。但今天发现个好玩的事情。

一、背景

jdbc连接中数据库地址使用域名,当DNS切换IP或者本地hosts修改了IP,那么连接池是依旧保持和旧库连接还是会更新连接到新库的。

二、c3p0 测试

结果是,连接池重新和新IP建立连接,如果域名解析不到IP,则连接池中无可用连接。

netstat -ano | grep 3306

也会发现和旧IP建立的连接状态也慢慢关闭

三、druid 测试

1、本地测试条件有限,没有使用两个数据库,通过hosts将域名失效。JDBC连接jdbc:mysql://localhost-db:3306

#hosts
127.0.0.1 localhost-db

结果,连接池中的连接依旧有效可用。使用linux上netstat -ano | grep 3306,mac上使用netstat -anvp tcp | grep 3306

image.png

正好5个连接和初始化连接池大小一致。

2、注释掉

#hosts
127.0.0.1 localhost-db

druid 会一致抛异常,打印错误日志 com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://localhost-db:3306,CreateConnectionThread#run

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver > has not received any packets from the server.

2、域名IP加回来 几乎立马好了

总结,以上说明数据库连接池有探活机制。

  1. c3p0自动检测,修改连接池。

  2. druid 删除域名IP配置时

image.png

连接还在,但是调用获取连接查询数据接口时,发现到服务端网络不通,销毁了所有连接。

image.png

3。druid 添加回域名IP配置时

druid在获取连接时触发,在循环中不断的重试。host域名配置好后,建立一个连接。但连接池没有回复到5个,c3p0是可以回复到参数配置的连接数大小。

image.png