【发布时间】: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&useUnicode=true&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&useUnicode=true&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