當我配置hibernate連接到數據庫,並且出於某種原因連接失敗時,我注意到它在構建工廠時沒有拋出任何異常(這是可以接受的),當我調用sessionFactory.openSession()(這是不太可接受的)。更令人討厭的是,在我調用sessionFactory.openSession()之後,session.isConnected()返回true。 (這是完全不可接受的)。當openSession被調用並且無法建立與數據庫的連接時,Hibernate沒有拋出異常
直到那一刻告訴我它沒有連接到數據庫的唯一提示是由java.sql.SQLException導致的WARN日誌條目,它在內部捕獲並僅發送到記錄器。除了創建僞事務來強制執行異常外,還有其他方式來獲取連接狀態嗎? (也許在配置中有一個選項「不記錄失敗的連接嘗試,但拋出一個休眠異常)我已經搜索但沒有找到任何東西,非常感謝
讓我在這裏澄清三件事情:1)如果pool無法獲取或創建工作連接,則只會拋出異常 - 不會因爲某個特定連接失敗而拋出異常; 2)在實際需要之前,Hibernate不會嘗試獲得連接:'openSession()'不會**獲取一個; 3)Hibernate不會隱藏連接異常;但是,它會將其轉換爲未檢查的JDBCException,這是您應該捕獲的。 – ChssPly76 2009-09-08 16:40:17
我不確定你爲什麼關心連接失敗的原因_immediately_,而不是當你真正嘗試使用它時;但是如果你這樣做,調用''openSession().connection()'**將嘗試獲取它並捕獲'JDBCException',如果它失敗,你可以從中獲得嵌套的'SQLException'。 – ChssPly76 2009-09-08 16:42:57
你的第一個評論澄清了事情。現在唯一看起來很奇怪並且非常直觀的東西是這樣的:既然你說過Hibernate不會試圖獲得連接,如果它不需要的話,有一個Session.isConnected()方法有什麼意義?我是否需要嘗試以某種方式獲得連接才能信任isConnected()的返回值?如果是,那麼我不需要它,因爲我會在嘗試中得到一個異常。它沒有任何意義...... – Paralife 2009-09-10 07:18:41