数据库服务器重新启动后,Quartz Scheduler无法正常启动/恢复

问题描述:

我们有一个使用Quartz进行调度作业的Java应用程序。我们使用的石英版本是石英-2.2.1。石英配置使用JDBC作业存储。数据库服务器重新启动后,Quartz Scheduler无法正常启动/恢复

这里是与该系统中发生的事件序列:

  1. Quartz调度经由属性中配置文件和处于待机模式。
  2. 石英配置引用的数据库服务器作为计划维护的一部分重新启动。它在10分钟内出现。
  3. 数据库启动后,Quartz调度程序启动并引发连接关闭的异常。

以下是错误:

2017-05-28 00:05:45 [WARNING] [c3p0] A PooledConnection that has already signalled a Connection error is still in use! 
2017-05-28 00:05:45 [WARNING] [c3p0] Another error has occurred [ com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed. ] which will not be reported to listeners! 
2017-05-28 00:05:45 com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed. 
2017-05-28 00:05:45  at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190) 
2017-05-28 00:05:45  at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:388) 
2017-05-28 00:05:45  at com.microsoft.sqlserver.jdbc.SQLServerConnection.setAutoCommit(SQLServerConnection.java:1883) 
2017-05-28 00:05:45  at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:1568) 
2017-05-28 00:05:45  at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.restoreOriginalAtributes(AttributeRestoringConnectionInvocationHandler.java:141) 
2017-05-28 00:05:45  at org.quartz.impl.jdbcjobstore.JobStoreSupport.cleanupConnection(JobStoreSupport.java:3600) 
2017-05-28 00:05:45  at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3819) 
2017-05-28 00:05:45  at org.quartz.impl.jdbcjobstore.JobStoreSupport.recoverJobs(JobStoreSupport.java:834) 
2017-05-28 00:05:45  at org.quartz.impl.jdbcjobstore.JobStoreSupport.schedulerStarted(JobStoreSupport.java:690) 
2017-05-28 00:05:45  at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:567) 
2017-05-28 00:05:45  at org.quartz.impl.StdScheduler.start(StdScheduler.java:142) 

我的问题是,在当石英调度开始的时间,在数据库启动 - 那么为什么它抱怨说连接已经关闭?我知道它在内部使用c3p0连接池,并且应用程序在结帐时不验证连接。 c3p0连接池是否关闭石英调度程序正在使用的连接(处于待机模式)?

我想了解这个异常背后的原因以及可以做什么配置更改来防止它?

  1. 我应该验证石英属性文件结帐时的连接吗?它会帮助吗?
  2. 我们的c3p0.properties文件存在于我们的应用程序类路径中,石英也使用c3p0连接池。在那个c3p0.properties文件中,我们设置了c3p0.unreturnedConnectionTimeout = 3600c3p0.maxIdleTime = 3600。由于事件#2(当数据库服务器重新启动时)和事件#3(当石英调度程序启动时)之间的时间跨度为1小时(3600秒),这种配置是否会导致此问题。

任何帮助将不胜感激,谢谢!

可能您应该验证结帐时的连接,设置为c3p0.testConnectionOnCheckout=true

有关良好连接测试设置的更多信息,请参阅c3p0's docs on the subject

+0

感谢您的建议!您能否帮助我理解验证连接在结帐时如何帮助我的情况?除此之外,你认为我们应该调整其他属性,如c3p0.unreturnedConnectionTimeout = 3600和c3p0.maxIdleTime = 3600?最小池大小为1. – Aman

+1

调整是一个大问题。 ''c3p0.unreturnedConnectionTimeout'只有在你的应用程序中有一个错误并且它正在泄漏Connections时才相关。验证连接将让c3p0意识到它在关机前获得的连接不再好。那么c3p0会自动替换它们。 –