数据库服务器重新启动后,Quartz Scheduler无法正常启动/恢复
问题描述:
我们有一个使用Quartz进行调度作业的Java应用程序。我们使用的石英版本是石英-2.2.1。石英配置使用JDBC作业存储。数据库服务器重新启动后,Quartz Scheduler无法正常启动/恢复
这里是与该系统中发生的事件序列:
- Quartz调度经由属性中配置文件和处于待机模式。
- 石英配置引用的数据库服务器作为计划维护的一部分重新启动。它在10分钟内出现。
- 数据库启动后,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连接池是否关闭石英调度程序正在使用的连接(处于待机模式)?
我想了解这个异常背后的原因以及可以做什么配置更改来防止它?
- 我应该验证石英属性文件结帐时的连接吗?它会帮助吗?
- 我们的c3p0.properties文件存在于我们的应用程序类路径中,石英也使用c3p0连接池。在那个c3p0.properties文件中,我们设置了
c3p0.unreturnedConnectionTimeout = 3600
和c3p0.maxIdleTime = 3600
。由于事件#2(当数据库服务器重新启动时)和事件#3(当石英调度程序启动时)之间的时间跨度为1小时(3600秒),这种配置是否会导致此问题。
任何帮助将不胜感激,谢谢!
答
可能您应该验证结帐时的连接,设置为c3p0.testConnectionOnCheckout=true
。
有关良好连接测试设置的更多信息,请参阅c3p0's docs on the subject。
感谢您的建议!您能否帮助我理解验证连接在结帐时如何帮助我的情况?除此之外,你认为我们应该调整其他属性,如c3p0.unreturnedConnectionTimeout = 3600和c3p0.maxIdleTime = 3600?最小池大小为1. – Aman
调整是一个大问题。 ''c3p0.unreturnedConnectionTimeout'只有在你的应用程序中有一个错误并且它正在泄漏Connections时才相关。验证连接将让c3p0意识到它在关机前获得的连接不再好。那么c3p0会自动替换它们。 –