MySQL服务器有两个参数interactivetimeout和waittime,它们配置的数字决定了连接空闲后多久会失效。它们的默认值是28800,单位是秒,即是8小时。查看它们的值可以通过show variables
如:
show variables like '%timeout%';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| table_lock_wait_timeout | 50 |
| wait_timeout | 28800 |
+----------------------------+-------+
针对数据库连接失效问题,主要有两个方案,
方案一:
把interactivetimeout和waittime的值设置很大,如24小时,具体值可以根据实际设置。此方案会过久占用MySQL服务器的连接,所以不建议使用。
方案二:
c3p0提供了几个参数给用户用于测试连接是否可用。他们分别是automaticTestTable,connectionTesterClassName,idleConnectionTestPeriod,preferredTestQuery,testConnectionOnCheckin, testConnectionOnCheckout。组合使用这几个参数可以检测连接是否可用。idleConnectionTestPeriod,testConnectionOnCheckin,testConnectionOnCheckout,这三个参数设置什么时候检测连接是否可用,而automaticTestTable,connectionTesterClassName,preferredTestQuery用于设置使用什么方式检测连接。
idleConnectionTestPeriod:这个参数设置连接空闲后检测的周期,单位为秒。
testConnectionOnCheckin:布尔值,默认为false。如果值为true,在连接放入连接池时会异步发送检测请求到服务器,检测连接是否可用。
testConnectionOnCheckout:布尔值,默认为false。如果为true,在连接从连接池取出是,会同步发一个检测请求,以保证连接可用。
由于testConnectionOnCheckout每个连接使用前都做检测,这样会降低性能。如果要满足高性能的应用中,不建议使用。所以建议组合使用idleConnectionTestPeriod和testConnectionOnCheckin,以保证连接的可用。
automaticTestTable:如果设置了此值,c3p0会自动在数据库创建一个设置的表,用来检测连接是否可用。
preferredTestQuery:这个值为用于检测连接是否可用的查询语句。在一些数据库,如MySQL中直接使用"SELECT 1"就可以,不用依赖一个数据库存在的表。
connectionTesterClassName: 用户可以自定义一个类来检测数据库连接是否可用。
如果是MySQL服务器,在兼顾性能的方案上,检测时间使用idleConnectionTestPeriod和testConnectionOnCheckin配置,检测方式上最简单的就是"SELECT 1"。参考配置如下:
c3p0.maxIdleTime=3600
c3p0.testConnectionOnCheckout=false
c3p0.testConnectionOnCheckin=true
c3p0.preferredTestQuery=SELECT 1
c3p0.idleConnectionTestPeriod=1800