Java プログラムメモ


トップ

Tomcat で JTA を使用する

Tomcat では、 JTA の実装がありません。そこで、別途 JTA の実装をインストールする必要があります。 ここでは、オープンソースの JOTM を利用して JTA を利用可能とする手順を纏めます。

JTA のメリットとしては、以下のような物が挙げられます。

  1. プログラムでトランザクション管理を簡単に行うことができる
  2. 複数のシステム/リソースにまたがるようなトランザクションを管理できる
  3. 特定の環境に依存しない

※バージョンは Tomcat 5.5.9,JOTM 2.0.8 です。

インストール

こちらより最新版をダウンロードします。ダウンロードしたファイルを解凍し、lib フォルダに入っている jar を全て、
CATALINA_HOME/common/lib
にコピーします。また、使用する DB の JDBC Driver を同じフォルダにコピーします。

server.xml の設定

server.xml の GlobalNamingResources タグ内に、

  • DB 接続
  • トランザクション管理
上記2つに関するリソースを設定します。

※ここでは Oracle9.2.0 を例に記載します。

server.xml 設定例

・ ・ ・ <!-- Global JNDI resources --> <GlobalNamingResources> <!-- Test entry for demonstration purposes --> <Environment name="simpleValue" type="java.lang.Integer" value="30"/> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <Resource name="jdbc/oracle" auth="Container" type="javax.sql.DataSource"     <!-- JOTM の factory を使用するので注意が必要です --> factory="org.objectweb.jndi.DataSourceFactory" <!-- 以下は、一般的な DB の設定です。 --> driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:test" username="test" password="test-password" /> <!-- JOTM で JTA を使用するための設定 --> <Resource auth="Container" description="" name="UserTransaction" type="javax.transaction.UserTransaction" factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/> </GlobalNamingResources> ・ ・ ・ <!-- リソースリンクを設定する --> <Context path="/test" docBase="test.war"> <ResourceLink global="jdbc/oracle" name="jdbc/oracle" type="javax.sql.DataSource"/> <ResourceLink global="UserTransaction" name="UserTransaction"/> </Context> ・ ・ ・

設定は以上です。

コーディング

Context ctx; DataSource ds = null; UserTransaction utx = null; try { ctx = new InitialContext(); // データソースの取得 ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracle"); // トランザクションの取得 utx = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); } catch (NamingException e) { throw e; } Connection conn = null; try { // トランザクションの開始。 utx.begin(); // DB 接続の取得 conn = ds.getConnection(); Statement stmt = conn.createStatement(); stmt.executeUpdate("insert into hoge values (1, 'HOGE')"); stmt.executeUpdate("insert into hoge values (2, 'HUGA')"); // COMMIT utx.commit(); } catch (Exception e) { // ROLLBACK utx.rollback(); throw e; } finally { if (conn != null) { try { conn.close(); } catch (SQLException e) { } } }

プログラムメモ アフリカ雑貨・珈琲豆・アールブリュット作品 マゴソスクール クラウドファンディング
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送