与MySql的连接正在自动中止。如何正确配置连接器/J?

2022-08-31 20:13:49

我从错误消息中阅读了这个建议:

在应用程序中使用之前,应考虑使连接有效性过期和/或测试连接有效性,增加服务器配置的客户端超时值,或使用 Connector/J 连接属性“autoReconnect=true”来避免此问题。

我正在使用Spring和JPA。我应该在哪里配置连接器/J?(在 中,或在弹簧配置中,或在弹簧配置中,或在其他地方?persistence.xmlentityManagerFactorydateSource


答案 1

本文描述了防止连接中止的三种解决方案:

  1. 使用 配置连接字符串。这是 URL 连接字符串的一个属性,该属性在驱动程序级别工作。您需要更改数据源配置中的连接字符串。autoReconnect=true

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
    
  2. 增加超时。这通常是数据库的属性。您可以增加此值以查看是否获得较少的连接中止。

  3. 配置连接池以测试连接有效性。这是在池中完成的,而不是在驱动程序级别完成的。这将取决于您使用的数据源实现。但是,如果您使用池化数据源,例如 c3p0,它应该可以在数据源的属性中进行配置。

附加注释:

  • 数据源/池还可以具有超时,这与空闲连接保留在池中的时间相对应。为了不与数据库超时混淆。
  • 有几种方法可以测试连接的有效性。一种常见的方法是使用虚拟测试表。池将在虚拟测试表上发出选择,以查看连接是否仍然正常。

答案 2

AutoReconnect不建议这样做。从 MySQL 这里

驱动程序是否应尝试重新建立陈旧和/或失效的连接?如果启用,驱动程序将为在过时或失效连接上发出的查询引发异常,该查询属于当前事务,但在对新事务中的连接发出的下一个查询之前,将尝试重新连接。不建议使用此功能,因为当应用程序不能正确处理 SQLExceptions 时,它具有与会话状态和数据一致性相关的副作用,并且仅设计为在无法将应用程序配置为正确处理由死连接和过时连接导致的 SQLException 时使用。或者,作为最后一个选项,调查将MySQL服务器变量“wait_timeout”设置为较高值,而不是默认值8小时。


推荐