天天看點

Spring引用Tomcat的 JTA事務

Spring引用Tomcat的 JTA事務

Tomcat是Servlet容器,但它提供了JNDI的實作,是以使用者可以象在Java EE應用程式伺服器中一樣,在Tomcat中使用JNDI查找JDBC資料源。在事務處理方面,Tomcat本身并不支援JTA,但是可以通過內建JOTM達到目的。

如果你的應用最終部署到一個功能齊備的Java EE應用伺服器上,也許你更希望使用Java EE應用伺服器的JTA功能,這樣可以利用應用伺服器本身許多優化措施。下面,我們讓Tomcat通過JNDI開放JOTM的JTA的資料源,進而在Spring容器引用這個JNDI資料源,并在此基礎上提供JTA事務。我們所使用的環境是:Tomcat 5.5+JOTM 2.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不使用CAROL JNDI wrapper,進而可以避免類裝載錯誤的發生。

3. 配置Tomcat環境,配置JNDI的資料源

在<Tomcat安裝目錄>/conf/context.xml檔案中添加以下内容:

<Resource name="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"/>

<Resource name="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"/>

②JOTM JTA事務管理<Transaction factory="org.objectweb.jotm.UserTransactionFactory"jotm.timeout="60"/>

在Tomcat中配置兩個JNDI資料源,它們分别指向topicdb和postdb資料庫,如①處所示。最後配置JOTM的JTA事務管理器,該事務管理器自動對兩個JNDI中的資料源應用JTA事務。