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

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

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

你应该考虑是否到期。 和/或测试连接有效性 在应用程序中使用之前, 增加配置的服务器 客户端超时值,或使用 连接器/J连接属性 “autoReconnect=true”以避免出现这种情况 问题


我正在使用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
      ,然后键入
      startup.sh
      。请稍等片刻,等待启动序列完成,然后您的应用程序将再次运行一段时间。

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

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

      不建议使用此功能,因为它会对会话状态和数据一致性产生副作用

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

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

      总之,要获得到“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! -->
      
      
      5.
      20
      1800
      50
      
      然后创建一个文件“c3p0.properties”,该文件必须位于类路径的根目录中(即,对于应用程序的特定部分,无法重写它):

      c3p0.1特性 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
      
      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
      
      MySQL驱动程序未正确实现autoReconnect选项。第一个请求将失败,之后驱动程序将尝试重新建立连接。因为这个答案似乎是搜索引擎最喜欢的答案,如果它附带一些额外的解释就好了