关于连接池参数testWhileIdle,testOnBorrow,testOnReturn的疑问

错觉 发布于 2015/11/27 09:55
阅读 28K+
收藏 2

@wenshao 你好,想跟你请教个问题:

我想知道这3个参数如何配置比较好。

目前我们使用微服务框架Dropwizard进行server端接口的开发,该框架使用的是tomcat jdbc pool8,数据库是Mysql5.6

之前出现过如下错误:

The last packet successfully received from the server was 30,303 millisecond

我们对于mysql的配置如下:

max_connections=1000
wait_timeout=30
interactive_timeout=30

tomcat jdbc pool配置为:

minSize: 10
maxSize: 100
checkConnectionOnBorrow: true
checkConnectionOnConnect: true
checkConnectionOnReturn: true
checkConnectionWhileIdle: true
把几个参数都设置为true,貌似是解决了这个问题,然后我查看Druid的github文档

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_DruidDataSource%E5%8F%82%E8%80%83%E9%85%8D%E7%BD%AE

发现druid的推荐配置为:

<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />

1. 请问为什么druid设置testOnBorrow和testOnReturn为false呢, 如果从pool中获取(borrow)一个失效的连接怎么办??

2. 启用testOnBorrow以及testWhileIdle后,是不是testOnReturn也就可以设置为false了??

3. dropwizard中为什么必须把这几个参数都设置为true才能解决问题??

4. my.cnf中我这么配置没问题吧?网上好多说要把timeout设置为1年,我认为不太对,因为会出现大量sleep连接~



加载中
1
10书生
10书生

1. testOnBorrow和testOnReturn在生产环境一般是不开启的,主要是性能考虑。失效连接主要通过testWhileIdle保证,如果获取到了不可用的数据库连接,一般由应用处理异常。

2. 对于常规的数据库连接池,testOnBorrow等配置参数的含义和最佳实践可以参考官方文档。

3. 数据源库连接池的实现原理与dropwizard无关,既然mysql server的wait_timeout等参数被设置为30秒,那么就会主动关闭不活跃的客户端连接,几个test参数设置为true可以通过充分的检测移除不可用连接,并重新创建新的连接,保证应用都获取到健康的连接。

4. my.conf中的wait_timeout参数和interactive_timeout参数默认是28800秒,也就是8小时。一般在生产环境这个数值会被设置为7天甚至30天,目的是保证mysql不会因为流量稀少而主动关闭session. 至于是否会导致大量的sleep连接,这个请在理解以上原理后,自行思考吧。

错觉
错觉
谢谢 我回来测试一下
返回顶部
顶部