OracleXAException: XAER_RMERR (Internal XA Error)
在第一次運行范例時,您可能會得到以下錯誤:
WSRdbDataSour I DSRA8203I: Database product name : Oracle WSRdbDataSour I DSRA8204I: Database product version : Personal Oracle9i Release 9.2.0.1.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - Production WSRdbDataSour I DSRA8205I: JDBC driver name? : Oracle JDBC driver WSRdbDataSour I DSRA8206I: JDBC driver version? : 9.2.0.1.0 WSRdbXaResour E DSRA0304E:? XAException occurred. XAException contents and details are: The XA Error is??????????? : -3 The XA Error message is??? : A resource manager error has occurred in the transaction branch. The Oracle Error code is?? : 65535 The Oracle Error message is: Internal XA Error The cause is?????????????? : null. WSRdbXaResour E DSRA0302E:?XAException occurred.? Error code is: XAER_RMERR.? Exception is: <null> RegisteredRes E WTRN0078E: An attempt by the transaction manager to call start on a transactional resource has resulted in an error. The error code was XAER_RMERR. The exception stack trace follows: oracle.jdbc.xa. OracleXAException ???? at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1157) ???? at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:295) ???? at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.start(WSRdbXaResourceImpl.java:927) ???? at com.ibm.ejs.j2c.XATransactionWrapper.start(XATransactionWrapper.java:1267) ???? at com.ibm.ws.Transaction.JTA.JTAResourceBase.start(JTAResourceBase.java:164) ???? at com.ibm.ws.Transaction.JTA.RegisteredResources.startRes(RegisteredResources.java:389) ???? at com.ibm.ws.Transaction.JTA.TransactionImpl.enlistResource(TransactionImpl.java:1903) ???? at com.ibm.ws.Transaction.JTA.TranManagerSet.enlist(TranManagerSet.java:494) . . .
|
該錯誤是因為事務管理程序不能將事務轉換為 XA 事務。Oracle 明確的返回錯誤
XAER_RMERR
,錯誤代碼編號為 65535。
ORA-65535
不是一個有效錯誤代碼,并且
XAER_RMERR
實質上意味著 XA 發生了某些錯誤。這說明您的 Oracle 數據庫沒有被配置為支持 XA 事務。因此,當 WebSphere
Application Server 事務管理程序命令 Oracle 事務管理程序參與這個 XA 事務時,Oracle
拒絕該命令并拋出這個異常。
解決方法是運行 Oracle 安裝中包含的兩個腳本。這很可能需要通過您的 Oracle DBA 來執行,您必須以
SYSOPER
或
SYSDBA
身份登錄到 Oracle,以擁有足夠的權限來運行這些腳本。這些腳本是:
- directory:
<ORACLE_HOME>\javavm\install
- file:
initxa.sql
- file:
initjvm.sql
initxa.sql
腳本配置 XA 數據庫。一旦它成功運行,您的數據庫就被配置為 XA。該腳本在您第一次運行的時候可能成功。不幸的是,由于一些數據庫的內存空間太小,該腳本也可能無法成功運行。為修改該問題,運行
initjvm.sql
腳本。它可能也會運行失敗,但是在失敗時,該腳本會說明哪個參數需要調整。參數被保存在該文件中:
- directory:
<ORACLE_HOME>\database
- file:
init<DATABASE_SID>.ora
這個表說明了有兩個參數的值特別需要增大。對于特定的數據庫配置可能需要調整不同的參數。
Oracle Initialization Values
Parameter Name
|
Minimum Value
|
java_pool_size
|
12000000
|
shared_pool_size
|
24000000
|
一旦
initjvm.sql
運行成功,則
initxa.sql
就應該也可以成功運行。Oracle 數據庫需要重新啟動,以使修改生效。您可以重新啟動 WebSphere Studio 測試服務器并重新嘗試運行該范例。
XAException: XAER_RMERR (xa_recover)
您
也許能夠很正常的運行該范例,起碼在修改了這些問題之后變得正常。您可以開發通過 Oracle 使用 XA
事務的應用程序并正常運行該程序。但是可能有一天您會發現無法啟動 WebSphere Application
Server。該問題的發生可能是由于您沒有正常的關閉服務器,導致 WebSphere 和/或 Oracle 崩潰。WebSphere
的啟動錯誤類似于以下所示:
SecurityCompo I SECJ0243I: Security service started successfully SecurityCompo I SECJ0210I: Security enabled false WSRdbXaResour E DSRA0304E:? XAException occurred. XAException contents and details are: The cause is?????????????? : null. 36185510 WSRdbXaResour E DSRA0302E:? XAException occurred.? Error code is: XAER_RMERR.? Exception is: <null> XARminst????? E WTRN0037W: The transaction service encountered an error on an xa_recover operation. The resource was J2CXAResourceInfo : cfName = XA Example Data Source configProps = [Deployed Resource Adapter Properties] ???? OptionC_authDataAlias ??? ?java.lang.String ?????????? ?scott ???? UserName ????????? ?java.lang.String ?????????? ? scott ???? Password ?????????? ?java.lang.String ?????????? ?******** ???? TransactionResourceRegistration ?java.lang.String ?????????? ?dynamic ???? InactiveConnectionSupport ????????? ?java.lang.Boolean ?????? ?true ???? secureMode ?????? ?boolean ????????? ?true . . . The error code was XAER_RMERR. The exception stack trace follows: javax.transaction.xa.XAException ???? at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:626) ???? at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.recover(WSRdbXaResourceImpl.java:672) ???? at com.ibm.ws.Transaction.JTA.XARminst.recover(XARminst.java:130) ???? at com.ibm.ws.Transaction.JTA.XARecoveryData.recover(XARecoveryData.java:673) ???? at com.ibm.ws.Transaction.JTA.RecoveryManager.resync(RecoveryManager.java:1369) ???? at com.ibm.ws.Transaction.JTA.ResyncThread.run(RecoveryManager.java:1440)
ApplicationMg A WSVR0200I: Starting application: IBMUTC
|
該錯誤是由于事務管理程序無法執行 XA 恢復操作。Oracle 明確的返回錯誤 XAER_RMERR。作為最后一個錯誤,
XAER_RMERR
指出了 XA 發生了一些問題。這表明 WebSphere 沒有使用 Oracle
正常的關閉連接,可能是由于其中一個服務器沒有正常關閉,或者是全都沒有正常關閉。因為 WebSphere Application Server
試圖重新建立連接,則 Oracle 需要回滾進程中的任何事務,但是使用 WebSphere 登錄到數據庫的 Oracle 用戶(在本范例中是 scott
)不能執行恢復工作。
解決方法是為 Oracle 用戶賦予權限以執行恢復操作,特別是訪問內部使用的 Oracle 表以管理恢復。在 SQL Plus 中以
SYSOPER
或
SYSDBA
身份運行下列命令:
grant select on DBA_PENDING_TRANSACTIONS to PUBLIC
|
如果您不希望將該權限授予所有的用戶,可以僅指定錯誤中列出的用戶(在本范例中是 scott)。然后重新啟動數據庫,這一次您應該能夠成功的重啟 WebSphere 服務器。
posted @
2007-02-04 12:23 jncz 閱讀(2795) |
評論 (0) |
編輯 收藏