MySQL Connection to Db dies after >4<24 in Spring-Boot JPA Hibernate
阅读更多:MySQL 教程
问题背景
最近在使用 Spring-Boot、JPA 和 Hibernate 来访问 MySQL 数据库时,遇到了一个奇怪的问题:在程序运行 4-24 小时后,数据库连接会断开。这导致任何试图访问数据库的请求都会失败。
问题分析
经过仔细检查,发现这个问题是由于 MySQL 服务器的默认设置导致的。MySQL 服务器会自动断开闲置的连接,以避免过多的连接占用系统资源。默认情况下,MySQL 的 wait_timeout 配置为 8 小时,这意味着如果一个连接在 8 小时内没有任何活动,它就会被断开。而我们程序运行 4-24 小时后出现的问题正是因为这个限制导致的。
解决方案
要解决这个问题,我们需要调整 MySQL 服务器的配置文件,将 wait_timeout 值设置为更长的时间。在 /etc/mysql/mysql.conf.d/mysqld.cnf 文件中,可以找到 wait_timeout 的默认值,可以根据实际需求更改该值。
另外,还可以使用下面的代码段来保持连接活动状态:
import java.sql.*;
public class KeepAliveThread extends Thread {
private Connection connection;
public KeepAliveThread(Connection connection) {
this.connection = connection;
}
public void run() {
while (true) {
try {
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT 1");
resultSet.next();
Thread.sleep(1000*60*5);
}
catch (Exception e) {
e.printStackTrace();
break;
}
}
}
}
这个线程会定期向 MySQL 发送一个 SELECT 查询,以保持连接的活动状态。我们可以在每次创建连接时启动该线程。
总结
MySQL Connection to Db dies after >4<24 in Spring-Boot JPA Hibernate 的问题,是由于 MySQL 服务器的 wait_timeout 默认值过小导致的。我们需要调整 MySQL 服务器的 wait_timeout 配置,或使用线程定期发送 SELECT 查询来保持连接活动状态。这样就可以避免连接过期的问题,保证程序稳定地访问 MySQL 数据库。
极客教程