XAテスト移植

JBoss+MySQL用のシンプルなインテグレーションテストは既に以前作成してあったのだけれども,今回WebLogic+MySQL用に作ったものの方がよりシンプルかつテスト範囲が広いため,WebLogic用に作ったテストコードをJBoss用に移植した.

移植といってもよくみたらJNDIプロパティとデータソース名を変えるだけ(しかも定数クラスに切り出してあるので・・・)で至極簡単だったわけだが.

XDoclet用のタグもCMPとかを結局使わないことになったので"@ejb"から始まるやつのみ.

ところで,WebLogicは最後まで悩ませてくれる.以下のコードをEJB内で実行するとWebLogicではサーバ再起動するまで該当データソースが使えなくなる.

InitialContext ctx = new InitialContext(Const.JNDI_PROPS);
DataSource ds = (DataSource) ctx.lookup(Const.XADS_JNDI);
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
DataSource ds2 = (DataSource) ctx.lookup(Const.XADS_JNDI2);
Connection conn2 = ds2.getConnection();
Statement stmt2 = conn2.createStatement();

UserTransaction utx = this.sc.getUserTransaction();
utx.begin();
stmt.executeUpdate("INSERT INTO xasimpletest VALUES (100)");
stmt2.executeUpdate("INSERT INTO xasimpletest2 VALUES (200)");
ResultSet rs = stmt2.executeQuery("SELECT connection_id()");
rs.next();
int connectionId = rs.getInt(1);
stmt2.executeUpdate("KILL " + connectionId);
Thread.sleep(100);
try {
    utx.commit();
} catch (Exception e) {
    // expected
}

conn.close();
// for windows
try {
    stmt2.executeUpdate("SELECT 1");
} catch (Exception e) {
    // ignore
}
conn2.close();
ctx.close();

テストなので意図的にDBへの接続をKILLコマンドで切っているわけだが,運用時には何らかの原因により(例えばタイムアウトやネットワーク障害によって)接続が切れた場合,WebLogicでは管理者がサーバを再起動させるまでアプリが動かなくなるんじゃないかな,もしかして.

JBossの場合はこのコードを実行した後も引き続き別のコードからデータソースを利用できるのに.

また爆弾発言しちゃいますよ.

WebLogicってJCA実装しょぼい?