2017-06-14 46 views
0

我們有一個使用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秒),這種配置是否會導致此問題。

任何幫助將不勝感激,謝謝!

回答

1

可能您應該驗證結帳時的連接,設置爲c3p0.testConnectionOnCheckout=true

有關良好連接測試設置的更多信息,請參閱c3p0's docs on the subject

+0

感謝您的建議!您能否幫助我理解驗證連接在結帳時如何幫助我的情況?除此之外,你認爲我們應該調整其他屬性,如c3p0.unreturnedConnectionTimeout = 3600和c3p0.maxIdleTime = 3600?最小池大小爲1. – Aman

+1

調整是一個大問題。 ''c3p0.unreturnedConnectionTimeout'只有在你的應用程序中有一個錯誤並且它正在泄漏Connections時才相關。驗證連接將讓c3p0意識到它在關機前獲得的連接不再好。那麼c3p0會自動替換它們。 –