2012-07-22 34 views
0

我使用hibernate從數據庫中提取數據。我們有20多個節點的oracle RAC數據庫。當主服務器出現故障時,在休眠模式下切換到其他數據庫

現在的問題是,如果數據庫的一個節點發生故障,我不得不切換到另一個節點,在運行時沒有應用程序拋出錯誤,如果該節點關閉,我已經切換到第三節點,如明智。

當我們使用建立連接的傳統JDBC的風格,這是可以做到很容易的,因爲連接對象將是空的,當節點連接失敗

這就是這樣,我創建會話工廠,

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() 
    { 
     try 
     { 
     return new Configuration().configure("database.cfg.xml").buildSessionFactory(); 
     } 
    } 

,這是方式正在逐漸會議,

會話= HibernateUtil.getSessionFactory()的openSession()。

現在,我該如何識別節點出現故障,以便我可以嘗試連接到備用節點。

我不能使用以下類型的配置,因爲我所有的節點SID的不同

jdbc:oracle:thin:@(description=(address_list=(load_balance=on)(failover=on)  (address=(protocol=tcp)(host=host1)(port=1521))(address=(protocol=tcp)(host=host2)(port=1521)))(connect_data=(service_name=xxxxsid)(failover_mode=(type=select)(method=basic))) 

我抓我的頭2天弄清楚如何能夠做到這一點。

+0

由於在保證倍數副本之間一致性的問題,我強烈建議您依靠DBMS獲得冗餘/高可用性,並避免手動從應用程序切換。 – SJuan76 2012-07-22 18:34:29

+0

我不確定這會有所幫助,但還有另一個適用於RAC的Oracle JDBC驅動程序。我沒有使用它,但我相信JDBC驅動程序應接受多個數據庫URL。 – 2012-07-22 20:17:34

回答

0

我建議當你打開一個會話時,你應該做一個斷言(Java斷言),比如讀取會話狀態(只讀或其他),這樣你可以根據斷言檢查天氣連接是否激活您可以嘗試爲另一個節點獲取不同的會話。

此鏈接可以幫助你有點(作出斷言):

https://forum.hibernate.org/viewtopic.php?f=1&t=1001337

希望它可以幫助;-)

+0

嗨,感謝所有的答覆,當我調用會話對象的連接方法時,eclipse正在抱怨方法是obselete,我嘗試了diff方法。我在try塊中包含了session.createSQLQuery方法調用,如果連接失敗,它會拋出「Connection could not possible」錯誤,並且在異常塊中,我再次創建了一個嵌套的catch塊,在那裏我嘗試連接到其他節點 – 2012-07-24 11:36:31

相關問題