次のユースケースをサポートするために、Java SE(Java EEまたはSpringではない)でトランザクションマネージャー( Bitronix、JBoss TS、Atomikosなど)を使用するにはどうすればよいですか?
次のクラスがあると仮定します。
public class Dao {
public void updateDatabase(DB db) {
connet to db
run a sql
}
}
そして、次のように、そこからJavaRunnableを作成します。
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;
}
}
また、クライアントはサーブレットまたはその他のマルチスレッド環境にすることができます。
public MyServlet extend HttpServlet {
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws IOException {
Service service = new Service();
service.updateDatabases();
}
}
BEGINTRANSACTIONおよびENDTRANSACTIONパーツの正しいコードは何でしょうか?これも実現可能ですか?そうでない場合は、何を変更する必要がありますか?要件は、updateDatabases()メソッドを並行して(同時に複数のデータベースにアクセスするため)、トランザクションを維持することです。