mysql 和 pool 连接池 的 timeout引发的问题

项目使用了c3p0 pool, mybatis spring mvc

本地无问题,部署到服务器后发现偶尔会发生: Communications link failure due to underlying exception , 刷新下又好了。

查看了下参数和资料,发现是mysql设置和连接池设置冲突的问题:


默认情况为了提高性能,我们会在c3po参数配置最大空闲时间:

<property name="driverClass" value="${db.driverClass}" />
<property name="jdbcUrl" value="${db.jdbcUrl}" />
<property name="user" value="${db.user}" />
<property name="password" value="${db.password}" />
   <property name="initialPoolSize" value="3"></property>  
   <property name="maxIdleTime" value="7200"></property>  //这个参数
   <property name="maxPoolSize" value="40"></property>  
   <property name="minPoolSize" value="3"></property>   
   <property name="acquireRetryDelay" value="1000"></property>  
   <property name="acquireRetryAttempts" value="3"></property>  
   <property name="breakAfterAcquireFailure" value="false"></property>  

这个参数可以大大提高空闲连接对象的重用度以提升系统性能,但是也带来一个问题,7200即2个小时,如果这个connect对象被mysql服务器关闭了的话,那它就是个废的,这时候便c3p0会去重连一个,所以如果你刷新页面,应用程序又恢复正常了。 

也就是说mysql服务器在一个wait_timeout时间后如果这个连接不使用会被强制关闭,因此光配置maxIdleTime是不行的,必须修改mysql服务器端my.ini配置文件中的一些参数,使得连接最大时间》你的maxIdleTime 才不会出现这个问题。

通过这个命令可以查询当前mysql参数:

mysql>show variables like '%timeout'; 

打印结果如下: 

+----------------------------+-------+ 
| Variable_name | Value | 
+----------------------------+-------+ 
| connect_timeout | 5 | 
| delayed_insert_timeout | 300 | 
| interactive_timeout | 28800 |  //
| net_read_timeout | 30 | 
| net_write_timeout | 60 | 
| slave_net_timeout | 3600 | 
| wait_timeout | 28800 |    //
+----------------------------+-------+ 


 
interactive_timeout     
服务器在关闭连接前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户,默认数值是28800。
 
wait_timeout            
服务器在关闭连接之前在一个连接上等待行动的秒数,默认数值是28800,即如果没有事情发生,服务器在 8个小时后关闭连接。

有的主机是云服务器可能被修改成其它值了,因此应用程序发布上去需要核实一下这些配置,免得出现错误导致系统不稳定。

修改方式:
修改 /etc/my.cnf

# mysql conf /etc/my.cnf
# Created by http://www.wdlinux.cn
# Last Updated 2010.06.01


[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
[mysqld]
lower_case_table_names=1
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 128M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 2M
myisam_sort_buffer_size = 8M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 50
max_connections = 500
wait_timeout = 28800 //这个位置
interactive_timeout = 28800 //这个位置

max_connect_errors = 9
long_query_time = 1
tmp_table_size = 16M
#log-bin=mysql-bin
#binlog_format=mixed
#server-id = 1
default-character-set = utf8
[mysqldump]
quick
max_allowed_packet = 8M
[mysql]
default-character-set = utf8
no-auto-rehash
[myisamchk]
key_buffer_size = 12M
sort_buffer_size = 1M
read_buffer = 1M
write_buffer = 1M
[mysqlhotcopy]
interactive-timeout        

最后重启mysql即可

[root@sample ~]#/etc/rc.d/init.d/mysqld stop

[root@sample ~]#/etc/rc.d/init.d/mysqld start

你可能感兴趣的:(mysql 和 pool 连接池 的 timeout引发的问题)