Java分散式事務概念與實現示例

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

在java中有如下三種事務,
簡單的JDBC級的事務 JTA – 在EJB環境下,使用者得到事務並進行控制CMP – 完全由容器控制事務,使用者通過Bean配置檔案來定義事務行為 二三種都支援分散式事務,但只支援Java環境下的分散式事務。
下面討論如何在Java程式裡實現分散式事務,即在同一個事務裡訪問多個資料來源。實際上就是如何使用JTA. 
這裡假設使用Oracle資料庫,使用WebLogic部署應用,所要做的是如下幾步:
1. 配置
1.1 確認資料庫支援分散式事務 – oracle是支援分散式事務的,JDBC驅動也支援分散式事務
1.2 在WebLogic裡配置DataSource
1.2.1. 配置連線池,注意這裡應該選擇驅動是Thin XA而不是Thin
1.2.2. 配置資料來源,使用前面配好的XA的連線池
2. 程式實現
2.1. 實現自己的Xid
import javax.transaction.xa.*;
public class MyXid implements Xid
{
protected int formatId;
protected byte gtrid[];
protected byte bqual[];
public MyXid()
{
}
public MyXid(int formatId, byte gtrid[], byte bqual[])
{
this.formatId = formatId;
this.gtrid = gtrid;
this.bqual = bqual;
}
public int getFormatId()
{
return formatId;
}
public byte[] getBranchQualifier()
{
return bqual;
}
public byte[] getGlobalTransactionId()
{
return gtrid;
}
}
2.2. 通過JNDI找到WebLogic中配置好的資料來源
public XADataSource getXADataSource()
throws Exception
{
InitialContext ctx = new InitialContext( mgr.getProps());
XADataSource ds = (XADataSource)ctx.lookup(“jdbc/xaDS”);
return ds;
}
2.3. 使用XADataSource得到XAConnection,使用XAConnection得到XAResource,基於XAResource進行具體資料訪問。如果我們這裡lookup多個XADataSource,然後得到多個XAResource,就可以實現多資料來源的事務控制。
XADataSource xaDS;
XAConnection xaCon;
XAResource xaRes;
Xid xid;
Connection con;
Statement stmt;
int ret;
xaDS = getXADataSource();
xaCon = xaDS.getXAConnection();
xaRes = xaCon.getXAResource();
con = xaCon.getConnection();
stmt = con.createStatement();
xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
try {
xaRes.start(xid, XAResource.TMNOFLAGS);
stmt.executeUpdate(“insert into test_table values (100)”);
xaRes.end(xid, XAResource.TMSUCCESS);
ret = xaRes.prepare(xid);
if (ret == XAResource.XA_OK) {
xaRes.commit(xid, false);
}
}
catch (XAException e) {
e.printStackTrace();
}
finally {
stmt.close();
con.close();
xaCon.close();
}


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}

資料庫 最新文章