天天看點

websphere叢集環境下使用sqlserver XA存儲EJB Timer的 xa_rollback異常處理

感覺國内還是Tomcat用的多啊,自從跳槽,接觸的都是JBoss,WebSphere,weblogic什麼的,看來環境不一樣,用的東西真是差太多了。

記錄下來到這裡後遇到的第一個問題。

[b]問題描述[/b]:公司産品使用的EJB Timer實作任務排程(我X),結果在WAS叢集環境發現EJB Timer啟動出現異常,異常資訊(紅毛兒語言,〇疼):

data(000001473dcb128200000001000000790307be0ccbedc421199f30b5b214d3174ae0cade000001473dcb12820000000
1000000790307be0ccbedc421199f30b5b214d3174ae0cade000000010000000000000000000000000001)}
: javax.transaction.xa.XAException: Функция ROLLBACK: завершилась ошибкой.
Состояние: -4. Ошибка: "*** SQLJDBC_XA DTC_ERROR Context: xa_rollback,
state=1, StatusCode:-4 (0xFFFFFFFC) ***".

                at
com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:550)

                at
com.microsoft.sqlserver.jdbc.SQLServerXAResource.rollback(SQLServerXAResource.java:718)

                at
com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.rollback(WSRdbXaResourceImpl.java:1321)

                at
com.ibm.ejs.j2c.XATransactionWrapper.rollback(XATransactionWrapper.java:1303)
           

[b]問題背景和解決方案[/b]:

首先,叢集環境為了保證各節點的Timer同步,舍棄了WAS自帶的Timer持久化,而使用我們自己的資料庫作為WAS存儲Timer資料的地方。WAS存儲Timer的四張表:"LMGR","LMPR","TASK","TREG"。

其次,因為不同的節點,是以要使用分布式事務(XA),SQLServer在2012之前預設是不啟用這個功能的,需要手動實作,配置方式詳見[url]http://guanzhilibai.blog.163.com/blog/static/13587993201171052712887/[/url]

記錄一下基本步驟:

[list]

[*]1.MSDTC中啟動XA功能

[*]2.将sqljdbc_xa.dll拷貝到SQLServer的Binn目錄

[*]3.執行xa_install.sql存儲腳本,會在master表的Programability--Extended Stored Procedures下生成一堆存儲過程,并且生成一個新的role:sqlJDBCXAUser。在你要使用的使用者設定中,UserMapping-->選中master行-->勾選下面的sqlJDBCXAUser即可。

[*]4.應用中必須使用SQLServer提供的sqljdbc4.jar這個Driver

[/list]

再次,依據上面所說的,在WAS中建立Scheduler,并且使用這個XA的資料源和sqljdbc4的驅動。

問題出現後,發現資料庫中WAS的表已經建立,已經确定XA配置無誤。

在WAS的Resources--Schedulers中點選Drop table,報錯無法删除。

在資料庫中手動Drop table(那四個表),再回到WAS的schedulers中點選Create table,問題解決。

原因不明,估計這四個表是在XA沒配置好的時候就建立了,再使用XA導緻出現異常。

記錄一下供日後使用。

繼續閱讀