为什么Hibernate/JDBC/MySQL会在一天左右后断开连接?

为什么Hibernate/JDBC/MySQL会在一天左右后断开连接?,mysql,hibernate,Mysql,Hibernate,我有几个服务器进程,它们偶尔响应来自客户端的消息并执行只读事务 在服务器运行了几天后,它们停止正常工作,当我检查时,发现有一大堆关于连接被关闭的消息 当我查看它时,发现hibernate默认在某种开发模式下工作,在这种模式下,连接会在几个小时后断开,我开始使用c3po进行连接池 然而,即使使用c3po,我也会在服务器启动后24小时左右遇到这个问题 有没有人遇到过这个问题并知道如何解决?我对配置hibernate的复杂性还不够熟悉。MySQL JDBC驱动程序在8小时不活动后超时并断开连接 您可以

我有几个服务器进程,它们偶尔响应来自客户端的消息并执行只读事务

在服务器运行了几天后,它们停止正常工作,当我检查时,发现有一大堆关于连接被关闭的消息

当我查看它时,发现hibernate默认在某种开发模式下工作,在这种模式下,连接会在几个小时后断开,我开始使用c3po进行连接池

然而,即使使用c3po,我也会在服务器启动后24小时左右遇到这个问题


有没有人遇到过这个问题并知道如何解决?我对配置hibernate的复杂性还不够熟悉。

MySQL JDBC驱动程序在8小时不活动后超时并断开连接

您可以在JDBC URL中设置
autoReconnect=true
,如果您试图在驱动程序断开连接后进行查询,则会导致驱动程序重新连接。但这有副作用;例如,不能通过新连接维护会话状态和事务

如果使用
autoReconnect
,JDBC连接将重新建立,但不会自动重新执行出现异常的查询。因此,您确实需要在应用程序中捕获
SQLException
,然后重试查询


阅读了解更多详细信息。

我建议,在几乎所有的客户机/服务器设置中,在不需要连接时保持连接打开是个坏主意

我特别考虑DB2/z连接,但它同样适用于所有服务器(数据库和其他)。这些连接消耗服务器上的资源,这些资源在其他地方可以得到最佳利用

如果在一个成千上万的客户机连接到数据库的公司环境中保持连接打开,那么您甚至可能会让大型机屈服

我完全支持连接池的想法,但不太支持试图永远开放单个会话的想法

我的建议如下:

1/在连接池中有三种类型的连接:

  • 关闭(因此实际上不在您的池中)
  • 准备就绪,意思是客户机已打开但未使用
  • 主动的,指客户正在使用的
2/让您的连接池保持少量的就绪连接,最小为N,最大为M。N可以根据客户端请求连接的峰值速度进行调整。如果就绪连接的数量下降到零,则需要更大的N

3/当客户机需要连接时,为其提供一个就绪连接(使其处于活动状态),然后立即打开一个新的连接(如果现在就绪的连接少于N个)(但不要让客户机等待连接完成,否则您将失去池的优势)。这将确保始终至少有N个就绪连接。如果客户需要时没有准备好,他们将不得不在您创建新的时等待

4/当客户端完成活动连接时,如果就绪连接少于M个,则将其返回到就绪状态。否则,请关闭它。这将防止您拥有超过M个就绪连接

5/定期回收已准备好的连接,以防止过时的连接。如果有N个以上的就绪连接,只需关闭最旧的连接。否则,关闭它并重新打开另一个


这样做的好处是,在连接池中有足够的就绪连接和年轻连接可用,而不会使服务器过载。

MySql默认情况下会在8小时内超时

我也遇到了同样的异常,在忙碌了3天后解决了这个问题。请检查您是否正在使用iHibernate3。在这个版本中,需要显式地提到连接类名。还要检查jar是否在类路径中。检查以下链接中的步骤和注释


Remove
autoReconnect=true

我通过添加这些行更改了我的hibernate配置文件,现在可以使用了:

    <property name="connection.autoReconnect">true</property>
    <property name="connection.autoReconnectForPools">true</property>
    <property name="connection.is-connection-validation-required">true</property>
true
真的
真的
我认为使用c3p0池更好,并建议重新命名,但该解决方案目前正在运行,不会出现ant问题。
我让Tomcat开机24小时,连接没有中断。

请试一试。

谢谢比尔。我不担心会话状态,因为我的会话只在需要时打开,然后关闭;不管怎么说,把一个门开8小时可能是个坏主意。我应该将其配置到JDBL URL中,还是可以通过hibernate属性进行配置?我会在JDBC URL中进行配置。不建议使用
autoReconnect
属性,因为它有一些不需要的副作用。相反,您应该考虑将服务器上的
wait\u timeout
从默认值8小时增加到一个高值。参考:同意,但我也有池收缩到零。如果没有人在使用它,为什么要有一个连接呢?保留一些打开的If的全部意义是为了减少连接池中客户端的延迟。他们不想在你建立一个新的公司时等待。虽然通过将N设置为零可以获得想要的效果,但我想,我的问题是我正在使用hibernate。好吧,我不是直接控制连接。c3po、连接池或hibernate本身不应该在连接空闲时关闭连接吗?仅供参考,该链接是对我写的博客文章的剽窃。现在,我已经将原始版本更新为Hibernate的当前版本,并在这里添加了到示例代码的链接:它是否适用于ORCLE SQL?