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

Posted

技术标签:

【中文标题】与 MySql 的连接正在自动中止。如何正确配置Connector/J?【英文标题】:Connection with MySql is being aborted automatically. How to configure Connector/J properly? 【发布时间】:2011-01-05 19:58:41 【问题描述】:

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

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

我正在使用 Spring 和 JPA。我应该在哪里配置 Connector/J? (在persistence.xml,或entityManagerFactory spring 配置,或dateSource spring 配置,或其他地方?)

【问题讨论】:

请帮忙***.com/questions/47011116/… 【参考方案1】:

文中描述了三种防止连接中止的解决方案:

    使用autoReconnect=true 配置连接字符串。这是 URL 连接字符串的一个属性,它在驱动程序级别起作用。您需要更改数据源配置中的连接字符串。

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
    

    增加超时。这通常是数据库的属性。您可以增加此值以查看是否会减少连接中止。

    配置连接池以测试连接有效性。这是在池中完成的,而不是在驱动程序级别。这将取决于您使用的数据源实现。但它应该可以在数据源的属性中进行配置,如果您使用池化的,例如c3p0.

    Connection pooling options with JDBC: DBCP vs C3P0 http://snipplr.com/view/14725/c3p0-datasource-config-connectionpool/ http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing

其他 cmets:

数据源/池也可以有超时,这对应于空闲连接保留在池中的时间。不要与数据库超时混淆。 有几种方法可以测试连接的有效性。一种常见的方法是使用虚拟测试表。池将在虚拟测试表上发出选择以查看连接是否仍然正常。

【讨论】:

MySQL 驱动程序没有正确实现 autoReconnect 选项。第一个请求将失败,驱动程序会尝试在 AFTERWARDS 之后重新建立连接。 由于这个答案似乎是搜索引擎所青睐的答案,如果它带有一些额外的解释,关于 MySQL 的 wait_timeout 的含义,以及它应该如何与 c3p0 一起玩,那就太好了配置。面对这个问题,我可以看到 MySQL wait_time 是 28800。如果是 8 小时,那么我不想将其设置为 72 小时。我什至不明白如何接受连接会挂起长达 8 小时。 @StephaneEybert 我在这里找到了对这个问题的一个很好的解释:hibernatedb.blogspot.in/2009/05/…。这可能对将来的某人有所帮助 有人可以帮忙***.com/questions/47011116/… 测试表相对于preferredTestQuery有什么优势?【参考方案2】:

AutoReconnect 不推荐。来自 MySQL here

驱动程序是否应该尝试重新建立陈旧和/或失效的连接? 如果启用,驱动程序将对发出的查询抛出异常 属于当前事务的陈旧或死连接, 但会在发出下一个查询之前尝试重新连接 新事务中的连接。此功能的使用不 推荐,因为它具有与会话状态相关的副作用和 应用程序不处理 SQLExceptions 时的数据一致性 正确,并且仅在您无法使用时使用 配置您的应用程序以处理因死机导致的 SQLExceptions 并正确地过时的连接。或者,作为最后的选择, 调查将 MySQL 服务器变量“wait_timeout”设置为高 值,而不是默认的 8 小时。

【讨论】:

那么,推荐使用什么呢? 使用带有选项 testConnectionOnCheckout=true 的 c3po @AndersB 我使用 c3po,但错误仍然存​​在***.com/questions/47011116/… mysql 建议增加time_wait【参考方案3】:

这是为像我这样通过搜索引擎找到这篇旧帖子的人准备的。

其他答案是更好的长期解决方案。但是,如果您只需要立即再次运行mysql 连接,您可以先shutdown 然后restart tomcat 并且一切都会正常运行一段时间。这使您能够在制定长期解决方案时避免系统停机。

导航到terminal 中的$CATALINA_HOME,然后键入shutdown.sh,然后键入startup.sh。稍等片刻,让启动序列完成,然后您的应用将再次运行一段时间。

【讨论】:

这个问题没有提到任何关于使用Tomcat的内容。 @thechrisproject 这个问题是关于春天的。 Tomcat 是用于托管 Spring 应用程序的主要容器。而这个答案中描述的方法解决了OP问题。 我们为什么要针对一些不能长期使用的解决方案?所有数据库服务器和连接都需要以长远的眼光进行设计 @sunil 因为有时这个问题发生在用户需要在那个时候专注于不同的可交付成果的 devbox 上。我给出的答案是立即解决方案,让开发人员能够等到他们​​有时间投资于更长期的解决方案。【参考方案4】:

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

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

不推荐使用此功能,因为它有与会话状态和数据一致性相关的副作用

当我查看 Hibernate 代码时。 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.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 的连接正在自动中止。如何正确配置Connector/J?的主要内容,如果未能解决你的问题,请参考以下文章

Spring 应用程序在 8 小时后失去与 MySql 的连接。如何正确配置?

Heroku - ClearDB:连接中止 - 对等方重置连接

如何正确连接 MySQL 数据库和 C# 应用程序?

如何在 ZeroMQ 中以正确的方式中止 context.socket.recv()?

(初学者)C#/WCF:套接字连接中止

如何正确的安装和连接MySQL服务