Java 正在自动中止与MySql的连接。如何正确配置连接器/J?
我从错误消息中阅读了以下建议: 你应该考虑是否到期。 和/或测试连接有效性 在应用程序中使用之前, 增加配置的服务器 客户端超时值,或使用 连接器/J连接属性 “autoReconnect=true”以避免出现这种情况 问题Java 正在自动中止与MySql的连接。如何正确配置连接器/J?,java,mysql,spring,jpa,connection-timeout,Java,Mysql,Spring,Jpa,Connection Timeout,我从错误消息中阅读了以下建议: 你应该考虑是否到期。 和/或测试连接有效性 在应用程序中使用之前, 增加配置的服务器 客户端超时值,或使用 连接器/J连接属性 “autoReconnect=true”以避免出现这种情况 问题 我正在使用Spring和JPA。我应该在哪里配置连接器/J?(在persistence.xml中,或者在entityManagerFactoryspring配置中,或者在dateSourcespring配置中,或者在其他地方?本文描述了三种防止连接中止的解决方案: 使用au
我正在使用Spring和JPA。我应该在哪里配置连接器/J?(在
persistence.xml
中,或者在entityManagerFactory
spring配置中,或者在dateSource
spring配置中,或者在其他地方?本文描述了三种防止连接中止的解决方案:
autoReconnect=true
配置连接字符串。这是URL连接字符串的一个属性,它在驱动程序级别工作。您需要更改数据源配置中的连接字符串
url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
- 数据源/池也可以有一个超时,它对应于空闲连接保留在池中的时间。不要与数据库超时混淆
- 有几种方法可以测试连接的有效性。一种常见的方法是使用虚拟试验台。池将在虚拟测试表上发出select,以查看连接是否仍然正常李>
不建议使用自动重新连接。来自MySQL 驾驶员是否应尝试重新建立陈旧和/或失效的连接? 如果启用,驱动程序将对在上发出的查询引发异常 属于当前事务的旧连接或死连接, 但将在上发出下一个查询之前尝试重新连接 新事务中的连接。不允许使用此功能 推荐使用,因为它有与会话状态和 应用程序不处理SQLException时的数据一致性 正确,并且仅设计用于您无法 配置应用程序以处理死机导致的SQLException 并正确处理陈旧的连接。或者,作为最后的选择, 研究将MySQL服务器变量“wait\u timeout”设置为高 值,而不是默认值8小时
这是给像我这样通过搜索引擎找到这篇旧帖子的人的 其他答案是更好的长期解决方案。但是如果您只需要立即重新运行
连接,您可以mysql
,然后关闭
重新启动
,一切都会正常工作一段时间。这使您能够在找到长期解决方案的同时避免系统停机tomcat
导航到终端中的
,然后键入$CATALINA_HOME
,然后键入shutdown.sh
。请稍等片刻,等待启动序列完成,然后您的应用程序将再次运行一段时间。我尝试了许多解决方案,问题得到了解决,但一段时间后连接超时或断开。2-3天后,我找到了解决问题的解决方案 许多解决方案建议使用autoReconnect=true但是当我浏览文档时。我在源代码中看到了以下描述autoReconnect参数的文本: 不建议使用此功能,因为它会对会话状态和数据一致性产生副作用 当我查看Hibernate代码时。Hibernate的基本连接机制不支持重新连接,必须使用H3C0连接池(它本身并不总是支持重新连接) 但一旦使用了H3C0,默认行为似乎是处理一个请求,如果连接已断开,则用户会看到并出错,但至少它会重新连接到下一个请求。我认为一个错误比无限个错误好,但仍然不如零个错误好。事实证明,我们需要optionTestConnectionOnOnCheckout——文档中不建议这样做,因为在请求之前测试连接可能会导致性能降低。当然,软件首先必须工作,其次才必须快速工作 总之,要获得到“work”的连接(我将其定义为包括通过无错误地重新连接来处理断开的连接):在“hibernate.cfg.xml”中:startup.sh
<!-- 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.1特性 c3p0.testConnectionOnCheckout=true 如果此解决方案不起作用,则有更多可能的解决方案:-5. 20 1800 50
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驱动程序未正确实现autoReconnect选项。第一个请求将失败,之后驱动程序将尝试重新建立连接。因为这个答案似乎是搜索引擎最喜欢的答案,如果它附带一些额外的解释就好了1。添加 org.hibernate.connection.C3P0ConnectionProvider 另外,不要忘记将c3p0-0.9.1.jar放在类路径中。 2.您不能在hibernate.cfg.xml中使用此属性,而不是使用c3p0.properties文件: 真的 同时签出此页面上的最后一篇文章: https://forum.hibernate.org/viewtopic.php?p=2399313 如果所有这些都不起作用,那就去[more][1]仔细阅读 [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html