一次朋友小聚,大家谈起了技术问题。一个在国企里的同学说,他们的系统很奇怪,每天早上都得重启一下应用程序,否则就提示连接数据库失败,他们都不知道该怎么办。
我当时稍加思索说了一下,应该是连接超时引起的。
这样的问题在我的业务场景没有遇到过,所以我就仔细阅读了相关的资料,查看其解决方案,因此在这里记录形成文档便于后面查看翻阅。
如果超过这个wait_timeout时间(默认是8小时)对数据库没有任何操作,那么MySQL会自动关闭数据库连接以节省资源。网站对数据库进行操作的时候却并未判断数据库连接是否断开,因此在管道(pipe)的这一端请求数据而另一端却被关闭的情况下,就会抛出这个Broken pipe
异常。
其解决方案如下:
-
在主线程中定时发送一个
SELECT
操作来确保数据库一直保持连接状态。 -
延长数据库的wait_timeout时间。
-
按照日志中给出的解决方案在程序中进行数据库操作之前检验数据库连接的有效性。
-
按照日志中给出的解决方案将MySQL数据库的
autoConnect
属性设置为true
。
接下来一一分析这几个解决方案是否可行
方法一
-
通过定时的
SELECT
操作来保持数据库连接的有效性
首先看一下Hibernate配置文件
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/DatabaseName</property>
<property name="connection.characterEncoding">utf-8</property>
<property name="connection.username">root</property>
<property name="connection.password">pa