应用程序和石英的连接池不同。在应用程序中,我们使用spring进行连接池,而quartz则强制使用quartz.properties连接池。 这是quartz.properties的片段
org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL = jdbc:mysql://localhost:3306/dbname?autoReconnect=true
org.quartz.dataSource.qzDS.user = dbuser
org.quartz.dataSource.qzDS.password =dbpassword
org.quartz.dataSource.qzDS.maxConnections = 30
org.quartz.datasource.qzDS.validationQuery = select 1
#org.quartz.datasource.qzDS.minEvictableIdleTimeMillis=21600000
#org.quartz.datasource.qzDS.timeBetweenEvictionRunsMillis=1800000
#org.quartz.datasource.qzDS.numTestsPerEviction=-1
#org.quartz.datasource.qzDS.testWhileIdle=true
org.quartz.datasource.qzDS.debugUnreturnedConnectionStackTraces=true
org.quartz.datasource.qzDS.unreturnedConnectionTimeout=120
org.quartz.datasource.qzDS.initialPoolSize=5
org.quartz.datasource.qzDS.minPoolSize=5
org.quartz.datasource.qzDS.maxPoolSize=30
org.quartz.datasource.qzDS.acquireIncrement=5
org.quartz.datasource.qzDS.maxIdleTime=120
org.quartz.datasource.qzDS.validateOnCheckout=true
数据库与两台服务器上的MASTER-MASTER复制集群在一起,它们通过应用程序和石英中的虚拟IP使用。
其中一台服务器(到目前为止我们遇到了备份服务器机器的问题)在调用notifyJobStoreJobComplete方法时偶尔会抛出数据库连接错误。这导致作业保持在BLOCKED状态,即使作业本身已成功完成但石英无法更新其状态。
编辑:提出问题。
答案 0 :(得分:0)
notifyJobStoreJobComplete期间的错误是:org.quartz.impl.jdbcjobstore.JobStoreTX - 无法覆盖连接自动提交/事务隔离。 [java] com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功收到的最后一个数据包是619,082,686毫秒之前。成功发送到服务器的最后一个数据包是619,082,686毫秒之前。比服务器配置的'wait_timeout'值长。您应该考虑在应用程序中使用之前过期和/或测试连接有效性,增加服务器配置的客户端超时值,或使用Connector / J连接属性“autoReconnect = true”来避免此问题。
答案 1 :(得分:0)
我认为主要的问题是MySQL的通信链路故障,我们通过将'wait_timeout'增加到14天来解决它,并且由于我们每15天安排一次维护,我们重启每个MySQL服务器是我们的数据库集群(我们有Master-Master复制到位)。通过方法,我们之后没有任何通信链路故障。实际上有些时候我们不会每15天重启服务器但仍然没有错误(触摸木板)。 :)
就Quartz触发器被锁定在BLOCKED状态而言,我们将石英更新为2.1.4,它可能具有几乎相同problem的修复。在石英更新之后,我们面对处于阻塞状态的触发器非常频繁。
我们仍然无法找到如何在不直接修改石英表的情况下使触发器退出BLOCKED状态。每当我们遇到这个问题时,我们都会从qrtz_fired_triggers表中手动删除BLOCKED触发器的条目,它解决了这个问题。我认为石英的企业版可能会从某些Web UI中获得此功能。