数据库连接长时间空闲后,爆连接已经关闭的解决办法

数据库连接长时间空闲后,爆连接已经关闭的解决方法

本文仅讨论使用连接池的情况:

在很多场合都碰到有人提问: 第二天第一次访问应用,总是报连接已经关闭(Connection Close)

其实,数据库连接池大都已经考虑了这个问题,进行设置一下即可:

Apache DBCP:

View Code JAVA
dataSource.setValidationQuery('select 1');

C3po:

View Code JAVA
dataSource.setTestConnectionOnCheckout(true);
dataSource.setPreferredTestQuery('select 1')

Proxool:

View Code JAVA
dataSource.setTestBeforeUse(true);
dataSource.setHouseKeepingTestSql('select 1')

Bonecp:
找不到对应的属性,不过可以配置连接的最大空闲时间

其实原来也就这么简单,返回连接给用户之前,先执行一条简单无害快速的SQL

 

<!-- google_ad_section_start -->
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10

 

原来是0.6.5的bug,使用0.7.0就解决此问题了。太信任他们了,以为是我配置或者数据库环境的问题呢。

<!-- google_ad_section_start -->
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10
<!-- google_ad_section_start -->
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10
<!-- google_ad_section_start -->
在是用BoneCP的时候,由于MySQL的wait_timeout配置是8小时,当8小时候,BoneCP连接池中的空闲连接会被MySQL服务器清除掉,当时以为是没有配置BoneCP的idleMaxAge和idleConnectionTestPeriod参数导致的,但是应该有默认值啊,idleConnectionTestPeriod的默认值是240分钟(即4个小时),那么每4个小时向MySQL发送一个测试SQL,应该不会被MySQL认为是空闲连接啊,那么应该是测试发送没有进行了,为了证明这点,测试如下:
把MySQL的wait_timeout改为5分钟,BoneCP的idleMaxAge设为4分钟,idleConnectionTestPeriod设为3分钟,结果到了5分钟后查看mysql的连接情况,发现一个连接也没有了,这是为什么呢?研究一天了,兄弟姐们,救救我!
补充下BoneCP的配置:
partitionCount=1
maxConnectionsPerPartition=20
minConnectionsPerPartition=10