Spring Boot和HikariPool - 2-3天后无法创建连接

19 浏览
0 Comments

Spring Boot和HikariPool - 2-3天后无法创建连接

我遇到了这个问题,一天后与数据库的连接丢失了。经过一些研究,我添加了以下属性(我了解到Spring Boot默认使用HikariPool作为数据源)。\n运行MySQL的show processlist显示由我的应用程序创建的10个休眠进程。\n这是我从Spring Boot中获得的错误:\n然而,奇怪的是,如果我杀掉其中一个进程,后端会重新连接,一切正常工作。\n在那段时间内,后端/前端没有被使用(或者我连接了2-3次以查看是否仍在工作),但是数据库没有任何高流量或负载。\n我不知道下一步该怎么办。\n后端:Spring Boot\n数据库:MySQL\n编辑:这可能是因为MySQL的wait_timeout,因为它具有默认值(8小时)吗?\n将其设置为比hikari的最大生命周期多一分钟是否更好?\n编辑2:将数据库的wait_timeout更改为31分钟,到目前为止连接仍然保持活动状态。\n这可能是问题吗?\n另一个更新:\n后端在1小时内似乎无响应(我不明白为什么,可能是我的互联网连接有问题),日志中没有显示任何内容。问题自行解决。\n但是,我发现在出现连接问题之前1小时,我有一个方法在凌晨1点删除了一些数据库条目。\nMySQL与后端未通过SSL连接,因此不会出现Public Key检索错误(最安全的选项),但现在我遇到了此错误,时间随机,后端重新启动并且问题消失。这可能是因为CPU负载过高/内存不足吗?\n这是ScheduleDeletions的样子:\n@Configuration\n@EnableAsync\n@EnableScheduling\npublic class ScheduleDeletions {\n @Autowired\n NotificationsRepository notificationsRepository;\n @Scheduled(cron = \"0 0 1 * * ?\")\n public void deleteOldNotifications() {\n final Calendar cal = Calendar.getInstance();\n cal.setTimeInMillis(new Date().getTime());\n cal.add(Calendar.DATE, -7);\n notificationsRepository.deleteAllByDateBefore(cal.getTime());\n }\n}

0
0 Comments

在这个问题中,出现了连接数据库失败的错误,原因是使用了SSL进行数据库连接,并且在ScheduledDeletions类中存在问题。下面是解决方法:

首先,我们需要在数据库连接中使用SSL。可以参考这个教程来进行配置。

接下来,我们需要修改ScheduledDeletions类中的代码。具体修改如下:

public class ScheduleDeletions {
    NotificationsRepository notificationsRepository;
    @Scheduled(cron = "0 0 0 * * ?")
    public void deleteOldNotifications() {
        System.out.println("Running scheduled deletion: " + notificationsRepository.count());
        final Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(new Date().getTime());
        cal.add(Calendar.DAY_OF_MONTH, -7);
        notificationsRepository.deleteAllByDateBefore(cal.getTime());
        System.out.println("Run successful on scheduled deletion: " + notificationsRepository.count());
    }
}

上述代码中的修改步骤如下:

1. 这一步是可选的,因为它默认是启用的。

2. 这一步是必需的,因为在出现错误时,它将恢复数据库的更改。可以参考这个帖子来了解更多信息。

3. 这一步是比较奇怪的,因为我想要删除7天前的通知,将Calendar.DATE更改为Calendar.DAY_OF_MONTH可以帮助我解决错误。

对于那些第一次处理大型项目的人来说,我有一个建议(因为这是我第一个大型项目,我正在从中学习)。即使你的代码在本地机器上运行正常,你也不知道它在另一台机器上运行5-6天后会发生什么情况。所以最好获取一个主机并让它运行,启用日志记录器,并且如果你正在使用Spring Boot,可以启用垃圾回收日志,这会挽救你的生命。

0
0 Comments

在错误日志中出现以下错误:

com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed

您应该尝试将allowPublicKeyRetrieval=true添加到JDBC连接字符串中。类似于这样:

jdbc:mysql://HOST:PORT/DBNAME?allowPublicKeyRetrieval=true

更多详细信息请参见https://community.atlassian.com/t5/Confluence-questions/MySQL-Public-Key-Retrieval-is-not-allowed/qaq-p/778956

你好,我更改了那部分内容,但是不建议使用它,因为它不安全。现在我正在使用数据库连接的SSL,但是过了一段时间后我又遇到了另一个错误:"SQL Error: 0, SQLState: null"。我真的不知道该怎么办了,因为这个问题似乎没有消失。它会自动重新启动,然后数据库又正常工作了,但这并不是一个真正的解决办法,因为存在导致这个问题的原因。

好的...也许你的代码有问题?可能是难以检测到的数据库连接泄漏。如果可能的话,请在您的问题中附上一些代码示例。至少与定时调用相关的部分(com.project.SpringREST.security.ScheduleDeletions.deleteOldNotifications)。

谢谢您的回复!我编辑了我的问题并添加了那个方法。

0