OracleXAException: XAER_RMERR (Internal XA Error)
在第一次運(yùn)行范例時(shí),您可能會(huì)得到以下錯(cuò)誤:
WSRdbDataSour I DSRA8203I: |
該錯(cuò)誤是因?yàn)槭聞?wù)管理程序不能將事務(wù)轉(zhuǎn)換為 XA 事務(wù)。Oracle 明確的返回錯(cuò)誤
XAER_RMERR
,錯(cuò)誤代碼編號(hào)為 65535。
ORA-65535
不是一個(gè)有效錯(cuò)誤代碼,并且
XAER_RMERR
實(shí)質(zhì)上意味著 XA 發(fā)生了某些錯(cuò)誤。這說(shuō)明您的 Oracle 數(shù)據(jù)庫(kù)沒(méi)有被配置為支持 XA 事務(wù)。因此,當(dāng) WebSphere
Application Server 事務(wù)管理程序命令 Oracle 事務(wù)管理程序參與這個(gè) XA 事務(wù)時(shí),Oracle
拒絕該命令并拋出這個(gè)異常。
解決方法是運(yùn)行 Oracle 安裝中包含的兩個(gè)腳本。這很可能需要通過(guò)您的 Oracle DBA 來(lái)執(zhí)行,您必須以
SYSOPER
或
SYSDBA
身份登錄到 Oracle,以擁有足夠的權(quán)限來(lái)運(yùn)行這些腳本。這些腳本是:
- directory:
<ORACLE_HOME>\javavm\install
- file:
initxa.sql
- file:
initjvm.sql
initxa.sql
腳本配置 XA 數(shù)據(jù)庫(kù)。一旦它成功運(yùn)行,您的數(shù)據(jù)庫(kù)就被配置為 XA。該腳本在您第一次運(yùn)行的時(shí)候可能成功。不幸的是,由于一些數(shù)據(jù)庫(kù)的內(nèi)存空間太小,該腳本也可能無(wú)法成功運(yùn)行。為修改該問(wèn)題,運(yùn)行
initjvm.sql
腳本。它可能也會(huì)運(yùn)行失敗,但是在失敗時(shí),該腳本會(huì)說(shuō)明哪個(gè)參數(shù)需要調(diào)整。參數(shù)被保存在該文件中:
- directory:
<ORACLE_HOME>\database
- file:
init<DATABASE_SID>.ora
這個(gè)表說(shuō)明了有兩個(gè)參數(shù)的值特別需要增大。對(duì)于特定的數(shù)據(jù)庫(kù)配置可能需要調(diào)整不同的參數(shù)。
Oracle Initialization Values
Parameter Name | Minimum Value |
java_pool_size
|
12000000
|
shared_pool_size
|
24000000
|
一旦
initjvm.sql
運(yùn)行成功,則
initxa.sql
就應(yīng)該也可以成功運(yùn)行。Oracle 數(shù)據(jù)庫(kù)需要重新啟動(dòng),以使修改生效。您可以重新啟動(dòng) WebSphere Studio 測(cè)試服務(wù)器并重新嘗試運(yùn)行該范例。
XAException: XAER_RMERR (xa_recover)
您 也許能夠很正常的運(yùn)行該范例,起碼在修改了這些問(wèn)題之后變得正常。您可以開發(fā)通過(guò) Oracle 使用 XA 事務(wù)的應(yīng)用程序并正常運(yùn)行該程序。但是可能有一天您會(huì)發(fā)現(xiàn)無(wú)法啟動(dòng) WebSphere Application Server。該問(wèn)題的發(fā)生可能是由于您沒(méi)有正常的關(guān)閉服務(wù)器,導(dǎo)致 WebSphere 和/或 Oracle 崩潰。WebSphere 的啟動(dòng)錯(cuò)誤類似于以下所示:
SecurityCompo I SECJ0243I: Security service started successfully |
該錯(cuò)誤是由于事務(wù)管理程序無(wú)法執(zhí)行 XA 恢復(fù)操作。Oracle 明確的返回錯(cuò)誤 XAER_RMERR。作為最后一個(gè)錯(cuò)誤,
XAER_RMERR
指出了 XA 發(fā)生了一些問(wèn)題。這表明 WebSphere 沒(méi)有使用 Oracle
正常的關(guān)閉連接,可能是由于其中一個(gè)服務(wù)器沒(méi)有正常關(guān)閉,或者是全都沒(méi)有正常關(guān)閉。因?yàn)?WebSphere Application Server
試圖重新建立連接,則 Oracle 需要回滾進(jìn)程中的任何事務(wù),但是使用 WebSphere 登錄到數(shù)據(jù)庫(kù)的 Oracle 用戶(在本范例中是 scott
)不能執(zhí)行恢復(fù)工作。
解決方法是為 Oracle 用戶賦予權(quán)限以執(zhí)行恢復(fù)操作,特別是訪問(wèn)內(nèi)部使用的 Oracle 表以管理恢復(fù)。在 SQL Plus 中以
SYSOPER
或
SYSDBA
身份運(yùn)行下列命令:
grant select on DBA_PENDING_TRANSACTIONS to PUBLIC |
如果您不希望將該權(quán)限授予所有的用戶,可以僅指定錯(cuò)誤中列出的用戶(在本范例中是 scott)。然后重新啟動(dòng)數(shù)據(jù)庫(kù),這一次您應(yīng)該能夠成功的重啟 WebSphere 服務(wù)器。