2009-09-05 28 views
6

當我配置hibernate連接到數據庫,並且出於某種原因連接失敗時,我注意到它在構建工廠時沒有拋出任何異常(這是可以接受的),當我調用sessionFactory.openSession()(這是不太可接受的)。更令人討厭的是,在我調用sessionFactory.openSession()之後,session.isConnected()返回true。 (這是完全不可接受的)。當openSession被調用並且無法建立與數據庫的連接時,Hibernate沒有拋出異常

直到那一刻告訴我它沒有連接到數據庫的唯一提示是由java.sql.SQLException導致的WARN日誌條目,它在內部捕獲並僅發送到記錄器。除了創建僞事務來強制執行異常外,還有其他方式來獲取連接狀態嗎? (也許在配置中有一個選項「不記錄失敗的連接嘗試,但拋出一個休眠異常)我已經搜索但沒有找到任何東西,非常感謝

回答

3

正如ChssPly提到的,你不應該使用Hibernate的built在任何情況下都可以使用游泳池。除Proxool之外的另一種選擇(我沒有親自使用過,所以我不能親自擔保)是C3P0。它在設置連接池時肯定會拋出異常 - 我可以爲此保證:)由於這是我們的應用程序所需的行爲,因此它對我們來說非常合適。

0

對不起,重新提出了這個問題,但:我試過C3p0,它比內置更好,但就我的問題而言,它絕對沒有什麼不同於香草hibernate:如果它不能獲得連接,它會拋出異常,Hibernate捕獲該異常,並再次將其從我身上隱藏起來。通過使用c3p0,我仍然使用hibernate API,無論c3p0拋出什麼,它都會被休眠吸走。唯一的辦法就是以編程方式實例化c3p0數據源,如果不引發異常(我可以捕獲),然後將它傳遞給休眠。但後來我意識到要將一個DataSource傳遞給Hibernate,你只能通過JNDI URL來完成,而這不是一個選項。所以我最後的希望是實現自定義連接提供者,在裏面使用c3p0並在那裏捕獲c3p0的異常。還有其他的選擇嗎?

請注意,我沒有嘗試proxool,因爲它配置休眠似乎很棘手,但我並沒有給它一個公平的鏡頭。也很抱歉在徹底測試之前分配答案。

+1

讓我在這裏澄清三件事情:1)如果pool無法獲取或創建工作連接,則只會拋出異常 - 不會因爲某個特定連接失敗而拋出異常; 2)在實際需要之前,Hibernate不會嘗試獲得連接:'openSession()'不會**獲取一個; 3)Hibernate不會隱藏連接異常;但是,它會將其轉換爲未檢查的JDBCException,這是您應該捕獲的。 – ChssPly76 2009-09-08 16:40:17

+0

我不確定你爲什麼關心連接失敗的原因_immediately_,而不是當你真正嘗試使用它時;但是如果你這樣做,調用''openSession().connection()'**將嘗試獲取它並捕獲'JDBCException',如果它失敗,你可以從中獲得嵌套的'SQLException'。 – ChssPly76 2009-09-08 16:42:57

+0

你的第一個評論澄清了事情。現在唯一看起來很奇怪並且非常直觀的東西是這樣的:既然你說過Hibernate不會試圖獲得連接,如果它不需要的話,有一個Session.isConnected()方法有什麼意義?我是否需要嘗試以某種方式獲得連接才能信任isConnected()的返回值?如果是,那麼我不需要它,因爲我會在嘗試中得到一個異常。它沒有任何意義...... – Paralife 2009-09-10 07:18:41

相關問題