我从错误消息中阅读了此建议:
您应该考虑在应用程序中使用之前使连接有效性过期和/或测试,增加客户端超时的服务器配置值,或使用连接器/J 连接属性“autoReconnect=true”来避免此问题。
我正在使用 Spring 和 JPA。我应该在哪里配置 Connector/J?(在persistence.xml
,或在entityManagerFactory
弹簧配置中,或在dateSource
弹簧配置中,或其他地方?)
我从错误消息中阅读了此建议:
您应该考虑在应用程序中使用之前使连接有效性过期和/或测试,增加客户端超时的服务器配置值,或使用连接器/J 连接属性“autoReconnect=true”来避免此问题。
我正在使用 Spring 和 JPA。我应该在哪里配置 Connector/J?(在persistence.xml
,或在entityManagerFactory
弹簧配置中,或在dateSource
弹簧配置中,或其他地方?)
文本描述了三种防止连接中止的解决方案:
使用 配置连接字符串autoReconnect=true
。这是 URL 连接字符串的一个属性,它在驱动程序级别起作用。您需要更改数据源配置中的连接字符串。
url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
增加超时。这通常是数据库的属性。您可以增加此值以查看是否获得较少的连接中止。
配置连接池以测试连接有效性。这是在池中完成的,而不是在驱动程序级别。这将取决于您使用的数据源实现。但它应该在数据源的属性中进行配置,如果您使用池化的,例如c3p0。
补充意见:
AutoReconnect
不推荐。从这里的MySQL
驱动程序是否应该尝试重新建立陈旧和/或死连接?如果启用,驱动程序将为在陈旧或死连接上发出的查询抛出异常,这些查询属于当前事务,但会在新事务中的连接上发出下一个查询之前尝试重新连接。不建议使用此功能,因为当应用程序无法正确处理 SQLExceptions 时,它会产生与会话状态和数据一致性相关的副作用,并且仅在您无法配置应用程序以处理由以下原因导致的 SQLExceptions 时使用正确的死和陈旧的连接。或者,作为最后一个选项,研究将 MySQL 服务器变量“wait_timeout”设置为较高的值,而不是默认值 8 小时。
我经历了许多解决方案,我的问题得到了解决,但一段时间后连接超时或断开连接。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.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
这适用于像我这样通过搜索引擎找到这个旧帖子的人。
其他答案是更好的长期解决方案。但是,如果您只需要立即重新运行连接,那么mysql
您可以在一段时间内一切正常。这使您能够在制定长期解决方案时避免系统停机。 shutdown
restart
tomcat
导航到$CATALINA_HOME
中terminal
,然后键入shutdown.sh
,然后键入startup.sh
。稍等片刻以完成启动序列,然后您的应用程序将再次运行一段时间。