Spring引用Tomcat的 JTA事务

meleto 2011-01-02

Tomcat是Servlet容器,但它提供了JNDI的实现,因此用户可以象在JavaEE应用程序服务器中一样,在Tomcat中使用JNDI查找JDBC数据源。在事务处理方面,Tomcat本身并不支持JTA,但是可以通过集成JOTM达到目的。

如果你的应用最终部署到一个功能齐备的JavaEE应用服务器上,也许你更希望使用JavaEE应用服务器的JTA功能,这样可以利用应用服务器本身许多优化措施。下面,我们让Tomcat通过JNDI开放JOTM的JTA的数据源,进而在Spring容器引用这个JNDI数据源,并在此基础上提供JTA事务。我们所使用的环境是:Tomcat5.5+JOTM2.3。

1.添加所需的JAR文件

将JOTM以下类包添加到<Tomcat安装目录>/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

connector-1_5.jar

同时,还需要添加相应数据库的JDBC驱动类包,例如MySQL的mysql.jar。

2.配置JOTM

新建一个carol.properties配置文件,放置到<Tomcat安装目录>/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不使用CAROLJNDIwrapper,从而可以避免类装载错误的发生。

3.配置Tomcat环境,配置JNDI的数据源

在<Tomcat安装目录>/conf/context.xml文件中添加以下内容:

<Resourcename="jdbc/topicDS"auth="Container"type="javax.sql.DataSource"

①-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"/>

<Resourcename="jdbc/postDS"auth="Container"type="javax.sql.DataSource"

①-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"/>

②JOTMJTA事务管理<Transactionfactory="org.objectweb.jotm.UserTransactionFactory"jotm.timeout="60"/>

在Tomcat中配置两个JNDI数据源,它们分别指向topicdb和postdb数据库,如①处所示。最后配置JOTM的JTA事务管理器,该事务管理器自动对两个JNDI中的数据源应用JTA事务。

相关推荐