我从错误消息中读到了这个建议:
你应该考虑到期 和/或测试连接有效性 在您的申请中使用之前, 增加配置的服务器 客户端超时或使用的值 Connector / J连接属性 'autoReconnect = true'以避免这种情况 问题
我正在使用Spring和JPA。我应该在哪里配置Connector / J? (persistence.xml
,entityManagerFactory
弹簧配置,dateSource
弹簧配置,或其他地方?)
答案 0 :(得分:64)
该文本描述了防止连接中止的三种解决方案:
使用autoReconnect=true
配置连接字符串。这是URL连接字符串的属性,它在驱动程序级别工作。您需要更改数据源配置中的连接字符串。
url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
延长超时时间。这通常是数据库的属性。您可以增加此值以查看是否减少连接中止。
配置连接池以测试连接有效性。这是在池中完成的,而不是驱动程序级别。这取决于您使用的数据源实现。但是,如果您使用池化的,则应该可以在数据源的属性中进行配置,例如, c3p0
附加评论:
答案 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.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
。等待启动序列完成,然后您的应用程序将再次运行一段时间。