我的MySQL连接池有一点麻烦。
就是这种情况:
通过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,但是由于某种原因(CommunicationsException)无法查询Database1:
造成原因:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
成功接收到的最后一个数据包
来自服务器的39,376,539
毫秒前。最后一包
已成功发送到服务器是
39,376,539毫秒之前。更长
比服务器配置的值
'wait_timeout'。你应该考虑
到期和/或测试
在您使用之前的连接有效性
应用程序,增加服务器
客户端超时的配置值,
或使用连接器/ J连接
属性'autoReconnect = true'避免
这个问题。
有任何想法吗?谢谢!
最佳答案
如前所述,在连接池上启用连接验证。