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

Rom*_*man 48 java mysql spring jpa connection-timeout

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

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

我正在使用Spring和JPA.我应该在哪里配置Connector/J?(在弹簧配置中persistence.xml,或在entityManagerFactory弹簧配置中,或在dateSource其他地方?)

ewe*_*nli 67

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

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

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 增加超时.这通常是数据库的属性.您可以增加此值以查看是否减少了连接中止.

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

附加评论:

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

  • MySQL驱动程序未正确实现autoReconnect选项.第一个请求将失败,并且驱动程序尝试重新建立AFTERWARDS连接. (8认同)
  • @StephaneEybert我在这里找到了一个关于这个问题的真正好的解释:http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html.这有助于将来的某些人 (5认同)

Gau*_*wal 18

AutoReconnect不推荐.来自MySQL 这里

驾驶员是否应该尝试重新建立陈旧和/或死亡的连接?如果启用,驱动程序将为在旧连接或死连接上发出的查询抛出异常,这些查询属于当前事务,但会在新事务中在连接上发出下一个查询之前尝试重新连接.建议不要使用此功能,因为当应用程序无法正确处理SQLExceptions时,它会产生与会话状态和数据一致性相关的副作用,并且仅在您无法配置应用程序以处理由此产生的SQLExceptions时使用.死和陈旧的连接正确.或者,作为最后一个选项,研究将MySQL服务器变量"wait_timeout"设置为高值,而不是默认值为8小时.

  • 那么,建议改为呢? (8认同)