TomcatでJOTMを介してJTAをサポートする



Support Jta Via Jotm Tomcat



Tomcatはサーブレットコンテナですが、JNDI実装を提供するため、ユーザーはJNDIを使用して、JavaEEアプリケーションサーバーの場合と同じようにTomcatでJDBCデータソースを見つけることができます。トランザクション処理に関しては、Tomcat自体はJTAをサポートしていませんが、JOTMを統合することで実現できます。

アプリケーションが最終的にフル機能のJavaEEアプリケーションサーバーにデプロイされる場合は、Java EEアプリケーションサーバーのJTA機能を使用することをお勧めします。これにより、アプリケーションサーバー自体の多くの最適化を利用できます。次に、TomcatにJNDIを介してJOTA JTAデータソースを開き、Springコンテナ内のJNDIデータソースを参照させ、これに基づいてJTAトランザクションを提供します。使用する環境は、Tomcat 5.5 + JOTM2.3です。
1.必要なJARファイルを追加します
次のJOTMパッケージを/ common / libディレクトリに追加します。
jotm.jar
jotm_jrmp_stubs.jar
jotm_iiop_stubs.jar
ow_carol.jar
jta-spec1_0_1.jar
jts1_0.jar
objectweb-datasource.jar
xapool.jar
howl.jar
コネクタ-1_5.jar
同時に、MySQLのmysql.jarなど、対応するデータベースのJDBCドライバークラスパッケージを追加する必要があります。



2.JOTMの構成
新しいcarol.properties構成ファイルを作成し、それを/ common / classesディレクトリーに配置します。構成ファイルの内容は次のとおりです。
#JNDI呼び出しプロトコル
carol.protocols = jrmp
#ローカルRMI呼び出し
carol.jvm.rmi.local.call = true
#CAROLのJNDIラッパーを使用しないでください
carol.start.jndi = false
#ネームサーバーを有効にしない
carol.start.ns = false
#ファクトリクラスに名前を付ける
carol.jndi.java.naming.factory.url.pkgs = org.apache.naming
carol.start.jndiをfalseに設定して、JOTMがCAROL JNDIラッパーを使用しないようにし、クラスのロードエラーを回避します。

3. Tomcat環境を構成し、JNDIのデータソースを構成します。
以下を/conf/context.xmlファイルに追加します。



1-1:JNDIデータソース
factory = 'org.objectweb.jndi.DataSourceFactory' username = 'root' password = '1234'
driverClassName = 'com.mysql.jdbc.Driver' url = 'jdbc:mysql:// localhost:3309 / topicdb' maxActive = '30'maxIdle =' 30 '/>

1-2:JNDIデータソース

factory = 'org.objectweb.jndi.DataSourceFactory' username = 'root' password = '1234'
driverClassName = 'com.mysql.jdbc.Driver' url = 'jdbc:mysql:// localhost:3309 / postdb' maxActive = '30'maxIdle =' 30 '/>




2JOTMJTAトランザクション管理

または

type = 'javax.transaction.UserTransaction'
factory = 'org.objectweb.jotm.UserTransactionFactory'
jotm.timeout = '60' />


図1に示すように、tomcatでtopicdbデータベースとpostdbデータベースを指す2つのJNDIデータソースを構成します。最後に、2つのJNDIのデータソースにJTAトランザクションを自動的に適用するJOTMのJTAトランザクションマネージャーを構成します。

ノードで宣言されたリソースのデフォルトのコンテキストプレフィックスは「java:comp / env」であり、ノードは「java:comp」であることに注意してください。したがって、4を使用してトランザクションを宣言する場合は、対応するJNDIルックアップコードもUserTransaction ut =(UserTransaction)initCtx.lookup( 'java:comp / env / UserTransaction')に変更する必要があります。

テストコード:

ResultSet rs = null Statement stmt = null UserTransaction ut = null Connection conn = null Context initCtx = new InitialContext() Context envCtx = (Context) initCtx.lookup('java:comp/env') DataSource ds1 = (DataSource) envCtx.lookup('jdbc/topicDS') DataSource ds2 = (DataSource) envCtx.lookup('jdbc/postDS') ut = (UserTransaction)initCtx.lookup('java:comp/UserTransaction') conn1 = ds1.getConnection() conn2= ds2.getConnection() ut.begin() Conn1 operation Conn2 operation ut.rollback() .......