2012-03-21 134 views
0

我正在實現分佈式事務的2階段提交(使用2個數據庫)。我通過將網絡電纜拉到桌面計算機上,然後將其插回來模擬DB服務器連接丟失。但是,這會導致事務在數據庫連接對象丟失時執行「回滾」時失敗。有沒有一種方法可以檢索丟失的數據庫連接對象,或強制應用程序在特定時間段後嘗試重新連接到同一個連接。 我正在使用DB2和Websphere 6.1作爲應用程序服務器。數據庫連接通過jndi查找。使用Atomikos作爲事務管理器。連接池:檢索丟失的數據庫連接

通常情況下,在數據庫崩潰的情況下,實現兩階段提交的應用程序如何恢復(回滾)?恢復是應用程序的責任還是交易經理應該這樣做?

回答

2

我不認爲你的問題有什麼用回收做的,因爲它準備了2期交易之前可能發生。

如果您通過拔下網絡電纜來模擬故障,則應用程序服務器將很快注意到連接中斷,即應用程序嘗試執行其他數據庫操作時。但是,在DB2方面,連接看起來是空閒的,並且DB2或DB2運行的主機系統可能需要很長時間才能注意到連接中斷。一旦連接被識別爲斷開,回滾將只發生。與此同時,由於連接所持有的鎖,您可能會遇到問題。

如果您希望減少DB2在連接上啓動回滾之前花費的時間,那麼您可能需要調整服務器上的TCP保持連接設置。

+0

謝謝安德烈亞斯..我會測試這個。 但是有沒有其他方式可以在不更改數據庫服務器設置的情況下進行測試?我大多確信這個值將被修改用於生產服務器。我如何確保恢復呢? – Andy 2012-03-23 15:44:57

+1

嚴格地說,「恢復」意味着解決有問題的交易,即分佈式交易,其中至少有一個參與者已被要求準備交易,並非所有參與者都已提交/回滾。如果在DB2事務準備好之前(在您的方案中可能出現這種情況)發生故障,則不需要恢復(對於該資源),但鎖將保持到DB2檢測到連接中斷。如果事務已經準備好,那麼無論使用哪個連接,恢復都應該成功。 – 2012-03-24 17:09:31

+0

感謝您解釋它..現在我已經開始了。我想鎖定在DB是由於DB2服務器設置,而不是由於應用程序...讓我看看我可以做的改變這個笏。我也懷疑這筆交易沒有作爲其回滾的原因,但我會爲此發佈一個新問題。 – Andy 2012-03-26 15:11:12

1

我對Atomikos沒有任何的想法。

通常,事務管理器負責恢復。通常,在這種情況下,應用程序服務器將充當事務管理器並負責執行此活動。

數據庫連接丟失後,將收到StaleConnectionException,WAS運行時將清除該連接或該數據庫連接池中的所有數據庫連接(取決於您已配置的內容)。

在來自ds.getConnection的下一個請求時,應用程序可以使用新的連接。

應用程序不需要執行任何恢復活動(就數據庫而言)。

HTH

Manglu

+0

好的,你可以從DB2恢復中瞭解一些情況嗎?我的應用程序不執行連接檢索活動。但是,在數據庫連接丟失後,DB2數據庫會死鎖(-911錯誤),即回滾沒有成功完成。 – Andy 2012-03-22 01:57:58

+0

我在這裏看不到DB2死鎖的原因。這是令人驚訝的 – Manglu 2012-03-23 05:54:09

+0

更新在第一個數據庫上執行但未提交。我認爲要解決死鎖的原因,儘管有兩階段提交協議應該理想地避免/恢復。 – Andy 2012-03-23 13:52:07