環境:Grails的2.0.3,石英插件1.0-RC2Grails的石英插件凍結
我有一個從數據庫中讀取一個值的簡單石英工作。在第8次執行時,Job從數據庫讀取時凍結。還有一個網頁從數據庫中檢索值。一旦Job進入等待狀態,嘗試通過網頁讀取值也會凍結。
環境:Grails的2.0.3,石英插件1.0-RC2Grails的石英插件凍結
我有一個從數據庫中讀取一個值的簡單石英工作。在第8次執行時,Job從數據庫讀取時凍結。還有一個網頁從數據庫中檢索值。一旦Job進入等待狀態,嘗試通過網頁讀取值也會凍結。
數據源連接池的默認大小爲8,因此您可能沒有正確關閉連接以將它們返回到池中。
環境:Grails的2.2.0,石英插件1.0-RC5
我遇到了同樣的問題使用石英-1.0-RC5。
作爲一種解決方法,我用來自quartz-0.4.2的類替換了SessionBinderJobListener
類(僅將包更改爲新包),並且作業再次運行時沒有任何問題。所以它看起來像persistenceInterceptor
bean不會關閉連接或將它們返回到池中。也許在org.codehaus.groovy.grails.orm.hibernate.support.HibernatePersistenceContextInterceptor
有一個問題與沖洗和摧毀。
如果org.quartz.threadPool.threadCount
比dataSource
屬性中的maxActive小得多,則不會出現該問題(可能每個作業線程都已獲得其連接),否則將只需要更長的時間。
我在Quartz插件版本1.0.1中看到了同樣的情況。在第八次執行時,Job和Tomcat工作者都凍結了。使用withSession
並在作業的finally {}
塊中調用Hibernate session.disconnect()
。那就是訣竅。
def execute() {
def hsession
try {
DomainObject.withSession { ses ->
hsession = ses
....
}
} catch(Exception e) {
//log it etc.
} finally {
hsession?.disconnect()
}
}
降級到0.4.2版本的插件糾正了這個問題。與作業相同的代碼。我瀏覽了插件文檔,並沒有注意到任何提到需要明確關閉連接的內容。我不知道這是否是石英1.8.5中的錯誤,1.0-RC2插件使用的版本。 – ptsw 2012-07-24 15:58:05
我在日誌中注意到了這一點:07-23-2012 15:30:04 DEBUG org.hibernate.cache.StandardQueryCache >>在區域中緩存查詢結果:org.hibernate.cache.StandardQueryCache; timestamp = 5501251603378176 07-23-2012 15:30:04 DEBUG org.hibernate.jdbc.ConnectionManager >>事務在使用on_close連接釋放模式的會話上完成;一定要關閉會話以釋放JDBC資源! – ptsw 2012-07-24 16:04:46