关于数据库连接池的最大空闲时间的配置,来源:https://zhaoyanblog.com/archives/486.html
java的所有的连接池 无论是c3p0、dbcp还是druid,都有一个类似maxIdleTime配置项。具体含义就是当连接长时间没有向服务器发请求的时候,断开这个连接,避免对数据库连接的浪费。这个时间不是随便设的,它的依据是数据库的连接最大空闲时间。
以mysql为例,它有个_wait_timeout 参数,你可以通过命令show variables like “%timeout%”查看
+—————————–+———-+
| Variable_name | Value |
+—————————–+———-+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+—————————–+———-+
wait_timeout默认的时候是8个小时28800秒,但是有时候可能被不经意修改。这个时间表示当连接在28800个时间没有向服务器发请求的时候,它就会断开这个连接。
你可以通过set global wait_timeout=60000来修改。不过好像interactive_timeout也必须同时修改才可以,要不wait_timeout改不了,它会用interactive_timeout的值初始化wait_timeout(这个原理又是另外一回事了).
所以在使用连接池的时候maxWait或者maxIdleTime,这个参数必须设置为小于wait_timeout的值,否则的话,当你的连接长时间没和数据库交互,服务器早把你的连接断开了,而你的连接池还认为是有效的连接,除非你设置testOnBorrow或者testOnReturn设置为true,这样当连接每次从连接池中取出或者放回的时候检查下连接是否有效。不过这样回牺牲一点性能。
否则你就会收到下面这样类似的异常,特别是经过一个耗时长的查询之后,这个连接再用于进行下次数据库操作的时候。
The last packet successfully received from the server was 1,867,460 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure