2017-07-19 118 views
1

我有一個java應用程序(jar)作爲OSGI包安裝在Adobe體驗管理器中。MyBatis數據庫連接故障切換機制不起作用

在Java應用我有以下數據源的配置: 1.我使用的MyBatis-3在以下載人管理數據源彙集的連接: 使用特性如http://www.mybatis.org/mybatis-3/getting-started.html

2. Creating SQL Session factory in following manner : 
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); 

3. Using SQL Server 2014 as my database. 
提到

我們擁有數據庫服務器集羣,每當我們必須將修補程序應用於數據庫時,我們切換數據庫服務器。 即使dataSource URL保持不變,應用程序也會導致數據庫連接失敗錯誤。 僅在捆綁restard後才能解決問題。 連接池是否有任何方式可以自動重新連接或恢復? 我是MyBatis,SQL服務器和AEM的新手,非常感謝任何幫助。

+0

我假設你的冷備用方法,所有已經打開的數據庫連接都會失敗。對不起,我不知道MyBatis。但是,無論您是找到更好的集羣方法,還是應該使用ConnectionPool進行驗證。這意味着在派發連接之前,ConnectionPool會進行極其簡單的查詢。如果失敗,這個錯誤的連接將被丟棄,並打開一個新的連接。其他人也問過它,但沒有在這裏得到答案:http://mybatis-user.963551.n3.nabble.com/Connection-is-invalid-how-to-check-for-this-and- get-a-valid-connection-td4026961.html –

回答

2

對你來說最簡單的解決方法是設置一個pool-ping-query。看起來,您的連接在切換到冷備用數據庫時無法生存。他們必須重新開放。通過這個查詢,連接池可以檢查連接是否仍然正常。如果沒有,這個錯誤的連接將被關閉。我看了一下http://www.mybatis.org/mybatis-3/configuration.html。在那裏,你應該尋找參數

  • poolPingQuery
  • poolPingEnabled

我會與下面的配置

<dataSource type="POOLED"> 
    ... 
    <property name="poolPingQuery" value="/* ping */ SELECT 1"/> 
    <property name="poolPingEnabled" value="true"/> 
</dataSource> 

嘗試,但要知道,這是仍然不是一個優美的開關。它只檢查池中的連接。所有正在運行的交易仍然會出現錯誤。但是,如果您的交易時間很短,而不是大規模並行,而且不是非常關鍵,那麼它可能就沒有問題。

+0

謝謝你快速轉身,我讀了關於poolPingQuery,但我沒有發現它可以用來重新建立連接。我們有什麼方法可以進行優雅的切換,以避免正在進行的用戶會話出現任何錯誤? – Narendra

+1

我認爲,這不適用於您的Active/Passive SQL服務器羣集。您需要一個階段,兩個節點都處於活動狀態。在此主動/主動階段,您必須正常切換所有連接。 如果故障轉移非常重要,那麼您可能必須放棄連接池。這可能會讓一些事情變得更好。但表現會受到影響。 –

+0

我查看了SQL Server文檔。它說:「發生故障轉移時,虛擬網絡名稱(VNN)在啓動後註冊到新的活動節點。對於連接到SQL Server的客戶端或應用程序,此過程是透明**,並且**最大限度地減少了故障期間的應用程序或客戶端的停機時間。「 故障切換僅適用於**新**連接,我擔心,你必須仔細測試SQL集羣是如何工作的,最終「選擇1」仍然可以工作,即使連接的節點不再是活動的 –