52

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

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

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

4

4 回答 4

74

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

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

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

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

补充意见:

  • 数据源/池也可以有一个超时,它对应于空闲连接保留在池中的时间。不要与数据库超时混淆。
  • 有几种方法可以测试连接的有效性。一种常见的方法是使用虚拟测试表。池将在虚拟测试表上发出选择以查看连接是否仍然正常。
于 2010-01-16T11:36:33.210 回答
21

AutoReconnect不推荐。从这里的MySQL

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

于 2012-08-17T18:34:02.397 回答
0

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

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

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

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

但是一旦使用了 H3C0,默认行为似乎是处理请求,如果连接死了,那么用户会看到并出错 - 但至少它会重新连接下一个请求。我想一个错误比无限错误好,但仍然不如零错误。事实证明,需要选项testConnectionOnCheckout - 文档不推荐该选项,因为在请求之前测试连接可能会导致性能降低。当然,软件首先必须工作,其次才是它必须快速工作。

因此,总而言之,要获得与“工作”的连接(我将其定义为包括通过无错误地重新连​​接来处理断开的连接):在“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=true

如果此解决方案不起作用,则有更多可能的解决方案:-

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
于 2017-12-27T13:50:41.487 回答
-9

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

其他答案是更好的长期解决方案。但是,如果您只需要立即重新运行连接,那么mysql您可以在一段时间内一切正常。这使您能够在制定长期解决方案时避免系统停机。 shutdownrestart tomcat

导航到$CATALINA_HOMEterminal,然后键入shutdown.sh,然后键入startup.sh。稍等片刻以完成启动序列,然后您的应用程序将再次运行一段时间。

于 2015-01-20T21:46:42.500 回答