【问题标题】:JDBC CommunicationsException with MySQL DatabaseMySQL 数据库的 JDBC CommunicationsException
【发布时间】:2011-02-15 08:20:23
【问题描述】:

我的 MySQL-Connection-Pooling 有点问题。 是这样的:

通过 Quartz 安排不同的作业。所有作业都连接到不同的数据库,这些数据库一整天都可以正常工作,而每晚安排的作业因 CommunicationsException 而失败...

石英乔布斯:

Job1 runs 0 0 6,10,14,18 * * ?
Job2 runs 0 30 10,18 * * ?
Job3 runs 0 0 5 * * ?

如您所见,最后一个作业在 18 点运行,运行时间约为 1 小时。 早上 5 点的第一份工作是失败的。我已经在我的资源配置中尝试了各种参数组合,这是我现在正在运行的:

<!-- Database 1 (MySQL) -->
<Resource
 auth="Container"
 driverClassName="com.mysql.jdbc.Driver"
 maxActive="100"
 maxIdle="30"
 maxWait="10000"
 removeAbandoned="true"
 removeAbandonedTimeout="60"
 logAbandoned="true"
 type="javax.sql.DataSource"
 name="jdbc/appDbProd"
 username="****"
 password="****"
 url="jdbc:mysql://127.0.0.1:3306/appDbProd?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"
 testWhileIdle="true"
 testOnBorrow="true"
 testOnReturn="true"
 validationQuery="SELECT 1"
 timeBetweenEvictionRunsMillis="1800000"
/>

<!-- Database 2 (MySQL) -->
<Resource
 auth="Container"
 driverClassName="com.mysql.jdbc.Driver"
 maxActive="100"
 maxIdle="30"
 maxWait="10000"
 removeAbandoned="true"
 removeAbandonedTimeout="60"
 logAbandoned="true"
 type="javax.sql.DataSource"
 name="jdbc/prodDbCopy"
 username="****"
 password="****"
 url="jdbc:mysql://127.0.0.1:3306/prodDbCopy?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"
 testWhileIdle="true"
 testOnBorrow="true"
 testOnReturn="true"
 validationQuery="SELECT 1"
 timeBetweenEvictionRunsMillis="1800000"
/>
<!-- Database 3 (MSSQL)-->
<Resource
 auth="Container"
 driverClassName="net.sourceforge.jtds.jdbc.Driver"
 maxActive="30"
 maxIdle="30"
 maxWait="100"
 removeAbandoned="true"
 removeAbandonedTimeout="60"
 logAbandoned="true"
 name="jdbc/catalogDb"
 username="****"
 password="****"
 type="javax.sql.DataSource"
 url="jdbc:jtds:sqlserver://127.0.0.1:1433;databaseName=catalog;useNdTLMv2=false"
 testWhileIdle="true"
 testOnBorrow="true"
 testOnReturn="true"
 validationQuery="SELECT 1"
 timeBetweenEvictionRunsMillis="1800000"
/>

出于显而易见的原因,我更改了 IP、用户名和密码,但可以假定它们是正确的,因为应用程序一整天都成功运行。

最讨厌的是: 首先运行的第一个作业成功查询 Database2 但由于某种原因未能查询 Database1 (CommunicationsException):

原因: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 最后一个数据包成功接收 来自服务器的是 39,376,539 毫秒前。最后一个数据包 成功发送到服务器是 39,376,539 毫秒前。更长 比服务器配置的值 '等待超时'。你应该考虑 过期和/或测试 在您使用之前的连接有效性 应用,增加服务器 客户端超时的配置值, 或使用连接器/J 连接 属性'autoReconnect = true'以避免 这个问题。

有什么想法吗?谢谢!

【问题讨论】:

  • 你使用的是什么版本的mysql连接器/j?还有在 db1 和 db2 上运行的 mysql 版本是什么?
  • 嗨 Justin,Mysql connector/j 版本是 5.1.12 Mysql 服务器版本是 5.1.37-enterprise-gpl-advanced-log
  • 异常的堆栈跟踪中有什么有趣的吗?您是否正确使用了连接池?
  • 遗憾的是,堆栈跟踪中没有什么有趣的东西,除了上面的消息。我不知道我是否“正确”使用它,这取决于您所说的“正确”;)虽然这篇文章已有 3 个多月了,但问题仍然存在......我想知道为什么项目中没有其他人抱怨关于这个^_^
  • 我遇到了类似的问题。我已经尝试了 dsiebel 尝试过的所有方法,但仍然出现这些错误。你找到解决方案了吗?

标签: java tomcat jdbc quartz-scheduler


【解决方案1】:

正如它所说,在连接池上启用连接验证。

【讨论】:

  • 哇,有一个快速的 ;o) 正如它所说,我做到了 ;) 正如你在资源配置中看到的那样,我已经添加了各种验证参数。还是没有运气...
【解决方案2】:

当连接闲置一段时间时,我收到此错误。您的作业是否在某个时候停止访问数据库,然后运行一些查询?

链接失败时也会发生这种情况,如果连接没有断开,您可能需要与您的网络团队核实。

【讨论】:

  • 是的,他们有。最后一个作业在下午 6 点运行,第一个作业在早上 5 点运行。问题是:这只涉及一个数据库。正如我所说,DB2 上的 Select-Query 可以完美运行,而 DB1 上的类似查询却失败了,两者几乎没有同时使用。还有一堆参数可以防止无效连接留在池中,对吧?
【解决方案3】:

我在使用 Oracle 和 JDBC 时遇到了类似的问题。最终我消耗了数据库可用的所有连接,并且我没有放弃其中的任何一个,我的代码只会停止或超时。看看您是如何在代码中处理连接的。

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多