问题描述
部署在阿里云上面的WEB项目,每天第一次访问的时候都连接不上,刷新一下又可以正常访问了,第二天依然出现同样的问题。
原因
项目中使用了数据库连接池。MySQL默认的非交互式连接的闲置时间是8小时,当连接池里的连接闲置超过8小时后就会被MySQL数据库自动断开而失效。但是连接池并不知道连接已经失效了,依然保持着这些失效的连接。所以web项目在一段时间后访问页面时报错,而在刷新页面后连接池重新获取了有效的连接,所以项目又可以正常访问了。
解决方案
思路
报错的主要原因就在于数据库和连接池之间信息不对称(数据库已经断开了连接,而连接池并不知道连接已断开)。
所以,我们只要在数据库断开连接的时候,让连接池也断开连接就好了。(即减少连接池内连接的生存周期,使之小于MySQL的“wait_timeout”的值,MySQL默认的“wait_timeout”值就是8小时)
解决步骤
减少连接池内连接的生存周期,使之小于MySQL的“wait_timeout”的值。
以c3p0连接池为例,修改连接池配置的maxIdleTime;
<bean id