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

时间:2010-01-16 11:01:05

标签: java mysql spring jpa connection-timeout

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

  

你应该考虑到期   和/或测试连接有效性   在您的申请中使用之前,   增加配置的服务器   客户端超时或使用的值   Connector / J连接属性   'autoReconnect = true'以避免这种情况   问题

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

4 个答案:

答案 0 :(得分:64)

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

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

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

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

  4. 附加评论:

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

答案 1 :(得分:18)

建议不要

AutoReconnect。来自MySQL here

  

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

答案 2 :(得分:0)

我经历了很多解决方案,我的问题解决了,但是一段时间后连接超时或断开连接。经过2天3天,我找到了解决问题的解决方案。

许多解决方案建议使用 autoReconnect = true ,但是当我浏览文档时。我在源代码中看到了以下描述autoReconnect参数的文本:

不推荐使用此功能,因为它具有与会话状态和数据一致性相关的副作用

当我查看Hibernate代码时。 Hibernate的基本连接机制不支持重新连接,必须使用H3C0连接池(它本身并不总是支持重新连接)。

但是一旦使用了H3C0,默认行为似乎就是处理请求,如果连接已经死,则用户会看到并发生错误 - 但至少它会重新连接下一个请求。我认为一个错误比无限错误更好,但仍然不如零错误。事实证明,需要使用optiontestConnectionOnCheckout-文档不建议这样做,因为在请求之前测试连接可能会导致性能降低。当然,软件首先必须工作,其次才能快速工作。

总而言之,要获得与“work”的连接(我将其定义为包括通过重新连接而不出错来处理已断开的连接):在“hibernate.cfg.xml”中:

  <!-- hibernate.cfg.xml -->
    <property name="c3p0.min_size">5</property>
    <property name="c3p0.max_size">20</property>
    <property name="c3p0.timeout">1800</property>
    <property name="c3p0.max_statements">50</property>
    <!-- no "connection.pool_size" entry! -->

然后创建一个文件“c3p0.properties”,它必须位于类路径的根目录中(即无法为应用程序的特定部分覆盖它):

c3p0.properties

c3p0.testConnectionOnCheckout =真

如果这个解决方案不起作用,那么有更多可能的解决方案: -

1. Add

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

 Also dont forget to place the c3p0-0.9.1.jar in the classpath. 



    2. Instead of using that c3p0.properties file, couldn't you just use this property in your hibernate.cfg.xml:

<property name="hibernate.c3p0.validate">true</property>

    Also checkout the last post on this page:

    https://forum.hibernate.org/viewtopic.php?p=2399313

    If all these not work than go [more][1] and read in detail


  [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html

答案 3 :(得分:-9)

这适用于像我这样通过搜索引擎找到旧帖子的人。

其他答案是更好的长期解决方案。但是,如果您只需要立即再次运行mysql连接,则可以shutdown然后restart tomcat并且一切都会正常运行一段时间。这使您可以在找出长期解决方案时避免系统停机。

导航至$CATALINA_HOME中的terminal,然后输入shutdown.sh,然后输入startup.sh。等待启动序列完成,然后您的应用程序将再次运行一段时间。