MySQL数据库连接超时自动断开的解决方案

当MySQL的wait_timeout时间到达后,数据库会关闭无操作的连接。本文探讨了四种解决方案:1) 定时操作保持连接有效性;2) 延长wait_timeout时间;3) 检验数据库连接有效性;4) 设置属性。但这些方法各有局限,最终选择了在Hibernate配置中使用c3p0连接池的testConnectionOnCheckout属性,确保每次获取连接时检查并重建已关闭的连接。
摘要由CSDN通过智能技术生成
         一次朋友小聚,大家谈起了技术问题。一个在国企里的同学说,他们的系统很奇怪,每天早上都得重启一下应用程序,否则就提示连接数据库失败,他们都不知道该怎么办。
 

我当时稍加思索说了一下,应该是连接超时引起的。

这样的问题在我的业务场景没有遇到过,所以我就仔细阅读了相关的资料,查看其解决方案,因此在这里记录形成文档便于后面查看翻阅。

如果超过这个wait_timeout时间(默认是8小时)对数据库没有任何操作,那么MySQL会自动关闭数据库连接以节省资源。网站对数据库进行操作的时候却并未判断数据库连接是否断开,因此在管道(pipe)的这一端请求数据而另一端却被关闭的情况下,就会抛出这个Broken pipe异常。

其解决方案如下:

  1. 在主线程中定时发送一个 SELECT操作来确保数据库一直保持连接状态。

  2. 延长数据库的wait_timeout时间。

  3. 按照日志中给出的解决方案在程序中进行数据库操作之前检验数据库连接的有效性。

  4. 按照日志中给出的解决方案将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
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值