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

时间:2017-06-14 17:50:05

标签: java quartz-scheduler c3p0

我们有一个Java应用程序,它使用Quartz来调度作业。我们使用的石英版本是quartz-2.2.1。 quartz配置使用JDBC作业存储。

以下是系统发生的事件序列:

  1. Quartz调度程序通过属性文件配置并处于待机模式。
  2. 作为计划维护的一部分,将重新启动由quartz配置引用的数据库服务器。它出现在10分钟。
  3. 数据库启动后,Quartz调度程序启动并抛出连接关闭的异常。
  4. 这是错误:

    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. 我应该在quartz属性文件中验证结帐时的连接吗?这会有帮助吗?
    2. 我们的应用程序类路径中有c3p0.properties文件,quartz也使用c3p0连接池。在该c3p0.properties文件中,我们设置了c3p0.unreturnedConnectionTimeout = 3600c3p0.maxIdleTime = 3600。此配置是否会导致此问题,因为事件#2(重新启动数据库服务器时)和事件#3(启动石英调度程序)之间的时间跨度是1小时(3600秒)。
    3. 感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

您可能只需在结帐时验证连接,请设置c3p0.testConnectionOnCheckout=true

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