最近做的一个web项目,上线之后,第二天访问总是访问不到,数据库连接失败,重启jetty之后就没事了。
查询原因:原来是DB链接失效,mysql 的数据库有一个全局变量,设定数据库链接有效期限的,默认为8小时。如果超过这个时间,一直没有访问数据库的话,mysql会自动将其失效。
解决方法:(1)可以修改mysql DB的全局参数,不建议采用
(2)修改配置参数。
在数据库连接的配置文件中加上以下参数:
validationQuery=SELECT 1
testWhileIdle=true
timeBetweenEvictionRunsMillis=3600000
minEvictableIdleTimeMillis=18000000
testOnBorrow=true
参数意义:
通过设置validationQuery,连接池在返回数据库连接给申请者时会多执行一条sql语句来确保该连接的有效性。如果数据库方已经关闭了,连接池会重新建立连接并返回给申请者。通过测试似乎跟testWhileIdle没有关系,不管其是true或false都正常工作。
通过配置timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis,每过 timeBetweenEvictionRunsMillis毫秒Evictor会调用evict()方法,检查连接池中的连接的闲置时间是否大于 minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30分钟),是则销毁此对象,然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle。如果连接池的连接数小于最小空闲连接数,则创建数据库连接,同时检查连接池的连接是否小于maxIdle,是则把刚创建的连接放入连接池中,否则销毁此对象。
testOnBorrow true 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.