1. 程式人生 > >weblogic連線oracle資料庫遇到的一個問題

weblogic連線oracle資料庫遇到的一個問題

近期,在開發一個系統時,遇到一個問題,描述如下:

測試環境上一個呼叫儲存過程生成分數的功能,始終測試失敗,而本地環境上可以正常生成。

測試環境:將class程式碼庫釋出到伺服器weblogic上,weblogic配置資料來源,連線測試oracle資料庫,釋出測試環境。

本地環境:將原生代碼編譯後釋出到本地weblogic上,weblogic配置資料來源,連線測試oracle資料庫,釋出本地環境。

分析:原生代碼是最新版本,即與伺服器程式碼相同;測試環境日誌中無任何報錯資訊;在plsql中手動呼叫該儲存過程生成,可以正常生成。bug從發現過了4天,還是找不出原因。終於,系統要釋出到現場了,解決不了組長不讓回去。正在一籌莫展之際,負責技術架構一同事說配置組換了oracle的驅動。我們速度進行測試,將本地weblogic上oracle驅動程式由*Oracle's  Driver (Thin)  Versions:9.0.1,9.2.0,10,11改為*Oracle's  Driver (Thin XA)  Versions:9.0.1,9.2.0,10,11,重啟本地環境,驗證,問題重現了。果然是這個導致的。

原因:有XA的資料庫驅動使用時,指令碼中不能使用commit關鍵字。呼叫的儲存過程中由於使用了commit關鍵字,導致儲存過程執行失敗。將測試環境oracle驅動換為無XA的,再次驗證問題解決。

為資料庫使用XA

可通過使用XA版的資料庫驅動來使資料庫支援XA。由於XA版的資料庫驅動通常比非XA的難用許多,一個忠告是不到不得已的時候別使用XA驅動。

使用XA版的資料庫驅動常會導致不可預期且難於解決的錯誤。例如,將非XA驅動替換為XA版驅動常常會產生難於跟蹤的錯誤。因此,應該在專案開發和測試階段儘早的引入XA驅動(,及早暴露問題並解決之)。

在使用XA版的資料庫驅動時,可能碰到的錯誤種類包括本地事務錯誤和巢狀事務錯誤。當您在一個XA全域性事務正在進行的過程中試圖開啟新的事務,這些錯誤就會產生。這種情形會在多個環境下發生,但最常見的情況是混合本地事務模型與宣告式事務模型導致,以及在XA環境下使用儲存過程的情況。

當在XA環境下使用儲存過程,在儲存過程裡呼叫DDL(資料定義語句,如CREATE TABLE,BEGIN TRAN,END TRAN)常導致錯誤。這是最頻繁導致XA錯誤的罪魁禍首,並很難修正。例如在Oracle中,使用XA時,您可能會看到下面的錯誤資訊:

ORA-02089: COMMIT is not allowed in a subordinate session

如果使用非XA的資料庫驅動,大概您不會看到這個錯誤,因為DDL語句執行的時候JTA事務會暫停。當看到這個錯誤資訊,表明了您的儲存過程中包含DDL程式碼,並且(由資源管理器管理的)本地事務嘗試提交它的工作。