Tomcat5.0.28でUserTransaction
やっとできた.以下,その設定方法.
Tomcat-5.0.28 の $CATALINA_HOME/common/lib に以下のファイルを配備する.
JOTM-2.0.10から commons-logging.jar, connector-1_5.jar, howl.jar, jotm.jar, jotom_jrmp_stub.jar, jta_spec1_0_1.jar, jts1_0.jar, objectweb-datasource.jar, xapool.jar をコピー.
CAROL-2.0.5から ow_carol-all.jar をコピー(JOTM付属のow_carol.jarでうまくいかなかった).
あとお好きなJDBCドライバもコピーする(Oracle10gだったから ojdbc14.jar を使う).
以下の内容の carol.properties を $CATALINA_HOME/common/lib に作成する.
# lmi stands for Local Method Invocation (it's a "fake" RMI) carol.protocols=lmi # do not use CAROL JNDI wrapper carol.start.jndi=false # do not start a name server carol.start.ns=false
$CATALINA_HOME/conf/server.xmlの
<Resource name="jdbc/TestDS" auth="Container" type="javax.sql.DataSource" /> <ResourceParams name="jdbc/TestDS"> <parameter> <name>factory</name> <value>org.objectweb.jndi.DataSourceFactory</value> </parameter> <parameter> <name>url</name> <value>DB接続文字列</value> </parameter> <parameter> <name>username</name><value>DBユーザ名</value> </parameter> <parameter> <name>password</name><value>DBパスワード</value> </parameter> <parameter> <name>driverClassName</name> <value>oracle.jdbc.driver.OracleDriver</value> </parameter> </ResourceParams> <Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction" /> <ResourceParams name="UserTransaction"> <parameter> <name>factory</name> <value>org.objectweb.jotm.UserTransactionFactory</value> </parameter> <parameter> <name>jotm.timeout</name><value>60</value> </parameter> </ResourceParams>
この段階でTomcatを起動してみてログにこんな感じのメッセージが出るとうまく行ってる証拠(みたい).
2005/12/27 13:01:42 org.objectweb.jotm.Current <init> 情報: JOTM 2.0.10 2005/12/27 13:01:42 org.objectweb.jotm.Jotm <init> 情報: JOTM started with a local transaction factory which is not bound. 2005/12/27 13:01:42 org.objectweb.jotm.Jotm <init> 情報: CAROL initialization 2005/12/27 13:01:42 org.objectweb.carol.util.configuration.ConfigurationRepository init 情報: No protocols were defined for property 'carol.protocols', trying with default protocol = 'jrmp'. 2005/12/27 13:01:42 org.objectweb.jotm.Current <init> 情報: JOTM 2.0.10
設定したDataSourceとUserTransactionを使いたいアプリケーション(WAR)のMETA-INF/context.xmlに,こんな風な記述を追加しとく.
<Context path="/test"> <ResourceLink global="UserTransaction" name="UserTransaction" type="javax.transaction.UserTransaction"/> <ResourceLink global="jdbc/TestDS" name="jdbc/TestDS" type="javax.sql.DataSource"/> </Context>
DataSourceのlookupは,こう.
Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/TestDS");
UserTransactionのlookupは,こう.
Context context = new InitialContext(); UserTransaction ut = (UserTransaction)context.lookup("java:comp/UserTransaction");
JNDIの接頭子'java:comp'が鬱陶しい場合は,web.xmlの
試してみてないけど.:-P
あーっと勘違い.JNDIのENC名で参照するんだから
<resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/TestDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
ちょっとメンドイ.そいともlookupするとき,「シンプル名でlookupしてダメだったら,ENC名でlookupしてみる」とかしたほうが親切なのかも...うーん,どっちがいいかなぁ.:-(
→IBM Developer 日本語版 : IBM Developer: 開発者、技術者、SE、ITスペシャリストのための技術情報 - Japan
ふう,長い旅だった...
ps.
これで一応動いているんで,DataSourceがUserTransactionにバインドされたと思ってんだけど,ちゃんと試してみてるわけではない.
それとは別に,UserTransactionに参加させたくないDataSourceってどう設定するのか皆目検討が付かないので,誰か教えてほしい(他力本願モード).
(追記)ふと思ったんだけど,UserTransactionに参加したくなかったらDataSourceのファクトリをデフォのままにしとけばいいんじゃないだろか?いつか試してみよう.