问题描述
部署在阿里云上面的WEB项目,每天第一次访问的时候都连接不上,刷新一下又可以正常访问了,第二天依然出现同样的问题。
原因
项目中使用了数据库连接池。MySQL默认的非交互式连接的闲置时间是8小时,当连接池里的连接闲置超过8小时后就会被MySQL数据库自动断开而失效。但是连接池并不知道连接已经失效了,依然保持着这些失效的连接。所以web项目在一段时间后访问页面时报错,而在刷新页面后连接池重新获取了有效的连接,所以项目又可以正常访问了。
解决方案
思路
报错的主要原因就在于数据库和连接池之间信息不对称(数据库已经断开了连接,而连接池并不知道连接已断开)。
所以,我们只要在数据库断开连接的时候,让连接池也断开连接就好了。(即减少连接池内连接的生存周期,使之小于MySQL的“wait_timeout”的值,MySQL默认的“wait_timeout”值就是8小时)
解决步骤
减少连接池内连接的生存周期,使之小于MySQL的“wait_timeout”的值。
以c3p0连接池为例,修改连接池配置的maxIdleTime;
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃,默认为0 -->
<property name="maxIdleTime" value="600"/>
</bean>
其他解决方案
其他解决方案可参考:MySQL笔记-8小时连接闲置超时;
服务器上的WEB项目反复出现MySQL数据库连接失败解决办法

部署在阿里云的Web项目每天首次访问时因MySQL连接失效导致报错,刷新后恢复正常。原因是MySQL非交互式连接闲置8小时后自动断开,连接池未及时发现。解决方案是调整连接池配置,如c3p0的maxIdleTime,使其小于MySQL的wait_timeout,确保连接池内的连接生命周期短于数据库的断开时间。
3517

被折叠的 条评论
为什么被折叠?



