如何使用一個事務管理器(如Bitronix,JBoss TS或Atomikos)在Java SE(非Java EE或Spring)來支持以下使用案例:Java的:多個線程中的XA事務傳播
讓我們假設我們有以下類:
public class Dao {
public void updateDatabase(DB db) {
connet to db
run a sql
}
}
,我們從創建一個Java Runnable接口,如下所示:在鄰
public class MyRunnable extends Runnable {
Dao dao;
DB db;
public MyRunnable(Dao dao, DB db) {
this.dao=dao;
this.db = db;
}
public run() throws Exception {
return dao.updateDatabase(db);
}
}
現在烏爾服務層,我們有另一個類:
public class Service {
public void updateDatabases() {
BEGIN TRANSACTION;
ExecutorService es = Executors.newFixedThreadPool(10);
ExecutorCompletionService ecs = new ExecutorCompletionService(es);
List<Future<T>> futures = new ArrayList<Future<T>>(n);
Dao dao = new Dao();
futures.add(ecs.submit(new MyRunnable(dao, new DB("db1")));
futures.add(ecs.submit(new MyRunnable(dao, new DB("db2")));
futures.add(ecs.submit(new MyRunnable(dao, new DB("db3")));
for (int i = 0; i < n; ++i) {
completionService.take().get();
}
END TRANSACTION;
}
}
客戶端可以是一個Servlet或任何其他多線程環境:
public MyServlet extend HttpServlet {
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws IOException {
Service service = new Service();
service.updateDatabases();
}
}
什麼是正確的代碼BEGIN TRANSACTION和END TRANSACTION部分?這是否可行?如果不是,需要改變什麼?要求是保持updateDatabases()方法併發(因爲它將同時訪問多個數據庫)和事務性。
即使bean產生線程,EJB是否仍保持事務性,如下所示?由於J2EE規範實際上禁止來自產卵線程的資源適配器以外的組件,我相當懷疑它。 –
我的錯你是對的這是來自JBoss TS文檔 - 看起來XA規範本身要求整個事務在一個線程中進行。「X/Open XA接口指定必須從同一個線程上下文中調用與事務關聯相關的XA調用。」 – nsfyn55