2010-01-21 103 views
1

我正在學習使用Java SE 6項目的JPA w/Hibernate。我只想能夠檢測到Hibernate和我的數據庫(MS SQL Server)之間的連接是否打開。例如,我希望能夠檢測到這種情況,將其記錄下來,然後在60秒內重新嘗試重新連接。如何檢測與Hibernate/JPA打開數據庫連接?

這是我認爲會工作,但isOpen()並不似乎是我想要的(通常爲true):

EntityManagerFactory emf = Persistence.createEntityManagerFactory("rcc", props); 
if (emf != null && emf.isOpen()) { 
    EntityManager em = emf.createEntityManager(); 
    if (em == null || !emf.isOpen()) 
     // error connecting to database 
    else ... 

在我看來這是一個簡單的問題,但我不能找到一個回答!

+0

J2SE中的JPA?這是行不通的。你不是指Java SE或Java EE嗎? JPA是Java EE的一部分,因此您隱式使用Java EE。 – BalusC

+0

是的 - Java SE 6(1.6.0_18),很抱歉。現在修復。 –

回答

4

我會只是希望能夠檢測到Hibernate和我的數據庫(MS SQL Server)之間的連接是否打開。例如,我希望能夠檢測到這一點,記錄它,並在60秒內嘗試重新連接。

確實可以使用getDelegate()獲取EntityManager的底層提供者對象,然後訪問底層JDBC Connection。但仔細閱讀javadoc:

返回EntityManager的底層提供者對象(如果可用)。 該方法的結果是特定於實現的。

這使得您的代碼變得非常不便攜。首先它將您與底層實現聯繫起來(Hibernate的Session在這裏)。其次,你可能不總是得到相同的結果(至少不是在Java EE容器中)。

真的,你不想要這樣做,因爲這完全破壞了JPA的觀點。另外,你不想自己處理這個低級連接驗證。

不,相反,您應該使用一個(獨立)連接池,將爲您照顧。 c3p0就是其中之一,它可以配置爲connection testinglogging。使用連接池方式意味着更少的代碼,更好的可靠性,更好的恢復能力,更好的檢查,而不會失去可移植性。這對我來說看起來像是100%的雙贏局面。

+0

+1,完全同意。 – BalusC

0

我的經驗是與NHibernate。我希望它翻譯。在早期版本中,它非常積極地關閉數據庫連接。在後續版本中有一個選項可以打開它。你可以在Hibernate上檢查。

0

通常你使用一個數據源訪問數據庫,並配置它做你需要什麼,我這裏貼的基本配置,詳細配置谷歌爲它;)

<?xml version="1.0" encoding="UTF-8"?> 

<datasources> 
    <local-tx-datasource> 
    <jndi-name>EnterpriseDS</jndi-name> 
    <connection-url>jdbc:oracle:thin:@oracle10g:1521:sid</connection-url> 
    <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> 
    <user-name>username</user-name> 
    <password>password</password> 

    <min-pool-size>5</min-pool-size> 
    <max-pool-size>100</max-pool-size> 
    <query-timeout>60</query-timeout> 

    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name> 

    <metadata> 
     <type-mapping>Oracle10g</type-mapping> 
    </metadata> 

    </local-tx-datasource> 

</datasources>