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の場合はこのコードを実行した後も引き続き別のコードからデータソースを利用できるのに.
また爆弾発言しちゃいますよ.