2012-02-28 50 views
2

我有一個使用Spring-EntityManager(JPA)的應用程序,我想知道如果數據庫恰好在我上述應用程序的生命週期中不可用,會發生什麼情況。Spring-JPA EntityManager如何處理「斷開」連接?

我期望在這種情況下,它會在第一次拋出異常來處理數據庫上的任何事情,對嗎?

但是,比如我等了10分鐘,然後再試一次,數據庫恰好回來了。它會恢復嗎?我可以安排它嗎?

謝謝

回答

7

實際上,Spring和JPA都沒有任何關係。內部的所有持久性框架只需調用DataSource.getConnection(),並期望接收(可能是共用的)JDBC連接。一旦他們完成,他們close()連接有效地返回到池。

現在,當要求DataSource提供連接但數據庫不可行時,它將引發異常。這個異常會傳播出去,並以某種方式被你使用的任何框架處理。

現在要回答你的問題 - 通常DataSource執行(如等)將丟棄已知被斷開的連接並將其替換爲新的連接。這實際上取決於提供商,但可以放心地假設一旦數據庫再次可用,DataSource將逐漸擺脫生病連接並將其替換爲健康個人。

許多DataSource實現者提供了定期測試連接並在返回給客戶端之前的方法。這對在DataSource包含連接池並且當數據庫變得不可用時無法發現的池環境很重要。因此,在將其返回給客戶端之前,需要一些DataSource的測試連接(通過調用SELECT 1或類似的方法)並偶爾進行一次以消除斷開的連接,例如,由於底層TCP連接斷開。

TL; DR

,你會得到一個例外,系統通常一旦數據庫又回來工作。順便說一句,你可以輕鬆測試這個!

+0

謝謝,那正是我一直在尋找的。 – kkiefer 2012-02-28 13:33:15

相關問題