2013-10-29 249 views
2

我正在使用Hibernatec3p0進行連接池。由於我在多網狀數據庫環境中工作,並且碎片停機時間的可能性是一個現實的用例場景(通過手頭應用程序外部的方式,例如某人只是因爲某種原因無視碎片),所以我試圖讓c3p0一旦它檢測到數據庫連接已關閉,就會顯式關閉Hibernate會話,這樣我就可以在多分片掃描中跳過特定的分片會話。配置c3p0在連接關閉時關閉休眠會話

有沒有辦法配置c3p0通知Hibernate,調用Session.close()一旦發現連接已關閉,以致調用Session.isOpen()可以返回一個有意義的布爾值?

相關:Preemptively and gracefully check that org.hibernate.Session is still connected (via c3p0)

回答

3

簡單的答案是否定的,C3P0不會幫助你在這裏。

聽起來像(看這裏和你以前的問題)你正在做一些跨越c3p0的工作,那就是你持有長壽的Sessions而不是按照需要創建Sessions,然後及時摧毀他們。那種事情非常脆弱。它是存在避免的架構連接池。

你最好的選擇,國際海事組織,將是「不這樣做」。永遠不要緩存會話。那麼普通的連接測試(可能還會設置checkoutTimeout)將解決問題。如果分片關閉,嘗試獲取連接將失敗,如果這是最佳解決方法,則可以跳過分片。

c3p0對hibernate一無所知。 c3p0的作者感謝hibernate推廣他的(我的)圖書館,但c3p0不知道Session是什麼,只是一個連接。從理論上講,c3p0可以幫助你的唯一方法就是當它發現數據庫關閉(根據你的配置可能相當迅速或相當緩慢)時它可以向你報告事件。您可以通過close()會話來響應該事件。

不幸的是,c3p0還沒有提供鉤子,用戶可以通過鉤子來響應採集失敗。它可能—這是我正在考慮添加0.9.6的功能。但現在不是。然而,實現輪詢你的分片並自己關閉Sessions的事情是相當微不足道的。所有c3p0都會注意到中斷是調用DriverManager.getConnection(...)或dataSource.getConnection()並觀察異常。你可以自己做!

儘管如此,我仍強烈推薦第一種解決方案。擺脫長期存在的Session對象。