`
Fly_m
  • 浏览: 259679 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用JOTM进行Tomcat的JTA调用

阅读更多

    前段时间碰到一个需要访问多个数据库的例子,由于项目上是采用tomcat作为项目开发和布署,所以就没有考虑采用特定厂商的JTA实现,而是通过一个开源的JTA实现来完成tomcat和多个数据库之间的直接交互。

    多数据库访问最直接的问题就是在一个service中,存在着多个数据库dao对象,当前面的dao对象操作完成之后,如果后面的某一个dao访问出错,那么这个service应该如何进行回滚呢。一般来说,回滚应该是整个service一起回滚,所以就需要对这个service中的所有dao所涉及的sessionFactory进行处理。而对于hibernate+spring来说,spring是使用hibernate的sessionFactory来进行事务的控制和回滚的,而hibernate又是将由自己的一个transactionFactory引用相关的transaction来进行事务的提交和回滚。所以,如果要用到多个数据库,就需要一个支持多个数据库的transaction。JOTM就提供了一个开源的多数据库Transaction应用,它采用了支持XADatasource的Xpool来进行数据源管理。

    1,首先需要在项目中引入以下包:

		<!--这个为jotm的核心包 -->
		<dependency>
			<groupId>org.ow2.jotm</groupId>
			<artifactId>jotm-core</artifactId>
			<version>2.2.1</version>
		</dependency>
		<!-- 这个为xappol即XaDatasource的一个开源实现 -->
		<dependency>
			<groupId>com.experlog</groupId>
			<artifactId>xapool</artifactId>
			<version>1.5.0</version>
		</dependency>
		<!-- jotm的数据操作类包 -->
		<dependency>
			<groupId>org.ow2.jotm</groupId>
			<artifactId>jotm-datasource</artifactId>
			<version>2.2.1</version>
		</dependency>
		<!-- cmi配置包,jotm初始化时需要相应的包 -->
		<dependency>
			<groupId>org.ow2.cmi</groupId>
			<artifactId>cmi-all</artifactId>
			<version>2.0-RC7</version>
		</dependency>
		<!-- j2ee的api,tomcat中没有中 -->
		<dependency>
			<groupId>geronimo-spec</groupId>
			<artifactId>geronimo-spec-j2ee-connector</artifactId>
			<version>1.5-rc4</version>
		</dependency>

  2,在配置文件的根目录增加一个carol.properties文件(此文件是一个对命名空间以及jndi的配置支持)

carol.protocols=jrmp
carol.jvm.rmi.local.call=true
carol.start.jndi=false
carol.start.ns=false
carol.jndi.java.naming.factory.url.pkgs=org.apache.naming

 

3,在项目中配置数据源连接,这里就不能在spring或者hibernate的配置文件中配置数据源了(当然,如果配置成xadatabase可能会正确,没尝试过)。在web应用中,在webapp下新建立META-INF文件夹,并新建立context.xml文件。(有些文件说直接在tomcat的service.xml中创建,其实在每个项目中建立更加独立)tomcat在加载项目时会自动加载此文件。

<?xml version='1.0' encoding='utf-8'?>
<Context reloadable="false">
	<Resource name="jdbc/gtip"
			  auth="Container"
			  type="javax.sql.DataSource"
			  factory="org.objectweb.jotm.datasource.DataSourceFactory"
			  driverClassName="com.mysql.jdbc.Driver"
			  username="root" password=""
			  url="jdbc:mysql://localhost/gtip"/>
	<Resource name="jdbc/gtipext"
			  auth="Container"
			  type="javax.sql.DataSource"
			  factory="org.objectweb.jotm.datasource.DataSourceFactory"
			  driverClassName="com.mysql.jdbc.Driver"
			  username="root" password=""
			  url="jdbc:mysql://localhost/gtipext"/>

	<Resource name="UserTransaction"
			  auth="Container"
			  type="javax.transaction.UserTransaction"/>

	<Transaction factory="org.objectweb.jotm.UserTransactionFactory"
				 jotm.timeout="60"/>

 

这里建立了两个数据源,一个为gtip,一个为gtipext,且声明了一个默认的事务UserTransaction,同时声明了一个事务提供工厂,表示由jotm提供了一个事务实现。

4,在项目中引用这两个数据源,即在web.xml中引用数据源。

	<resource-env-ref>
		<description>gtip</description>
		<resource-env-ref-name>jdbc/gtip</resource-env-ref-name>
		<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
	</resource-env-ref>
	<resource-env-ref>
		<description>gtip</description>
		<resource-env-ref-name>jdbc/gtipext</resource-env-ref-name>
		<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
	</resource-env-ref>

 

这里即表示需要引用两个数据源定义

5,在hibernate.cfg.xml中配置数据源,表示引用此数据源

<property name="connection.datasource">java:comp/env/jdbc/gtipext</property>

 

这里就会引用gtipext的数据源,表示hibernate将通过此来寻找相应的datasource实现

6,在spring.xml中配置事务,并通知hibernate引用相关jtaTransactionFactory

<bean id="jotm" class="com.greejoy.develop.bean.JotmFactoryBean"/>

 此是一个jotmBean定义,此bean在Spring3.x版本上已经没有了,所以可以从spring2.5.6版本上直接将源码copy过来即可。这里就是一个工厂bean,去最终创建出一个jotm的current对象(或者不是创建,而是直接通过静态引用Current.getCurrent()直接获取)。在这里,就需要一个手段来获取到jotm对象。

	<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="transactionManager" ref="jotm"/>
	</bean>

 

事务管理器声明,表示定义了一个jta的事务管理器(其实它最没有实现transactionManager接口),但是最终的事务管理将由具体的transactionManager去实现,即将实现transactionManager的工作委派给容器或者具体的实现去做。

	<bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="configLocations" value="classpath*:conf/**/hibernate.cfg.xml"/>
		<property name="jtaTransactionManager" ref="jotm"/>
	</bean>

Hibernate的sessionFactory定义声明,其中需要一个jtaTransactionManager的属性定义,当hibernate解析此属性时,将会指定hibernate的transactionFactory实现为JTATransactionFactory(默认它会指定为JDBCTransactionFactory)。

 

至此,相应的配置工作即结束,在项目中可以使用spring跟以前一个的定义事务控制aop,并交由相关的transactionManager去进行控制。

 

ps:在spring的AnnotationSessionFactoryBean来说,在配置了jtaTransactionManager之后,spring会往hibernate中配置一个属性hibernate.transaction.manager_lookup_class,并引用hibernate寻找到相应的transactionManager。但是hibernate在3.5.3版本实现中,并没有使用lookupClass来寻找transactionManger,而是使用其去寻找userTransactionName,再自己根据userTransactionName通过initContext来取得transactionManager。在srping3.x的实现中,lookupClass(即LocalTransactionManagerLookup)的getUserTransactionName会返回null(虽然其getTransactionManager会返回相应的transactionManager)。hibernate没有使用这个方法,而是使用了getTransactionUsername方法。两者显示没有很好的对接,或者是其中一个考虑不太周全。

分享到:
评论

相关推荐

    java事务处理包正版的JOTM

    Java事务处理包(JOTM)是Java开放源代码事务管理器,它实现了Java Transaction API (JTA) 和Java Transaction Service (JTS) 的规范。JOTM 是一个强大的工具,尤其对于那些希望在Tomcat这样的轻量级应用服务器中实现...

    ow2-jotm-src-2.2.1-src.tar

    4. **集成配置**:在Tomcat的context.xml或server.xml中配置JOTM,以便应用服务器知道如何使用它进行事务管理。 5. **单元测试**:使用像Junit + TransactionControl这样的工具来模拟事务环境,进行事务相关的单元...

    spring+jotm 多数据源事务管理(三)JNDI+Tomcat

    为了能够顺利地在项目中使用JOTM进行事务管理,首先需要将以下JAR包加入到Tomcat的lib目录中: - `jotm.jar`: JOTM核心库。 - `jotm_jrmp_stubs.jar`: JOTM JRMP远程调用相关的类库。 - `ow_carol.jar`: 提供了与...

    开源事务管理器 JOTM.7z

    编程方式可以直接调用 JTA 接口,而声明式事务管理则可以通过容器(如 Tomcat 或 JBoss)进行配置,使事务管理更加透明。 在实际应用中,JOTM 可能会与诸如 Spring 框架等进行整合,Spring 提供的事务管理抽象层...

    flex与java整合专用jotm

    Flex与Java的整合是开发富互联网...通过理解和应用以上知识点,你可以成功地将Flex应用程序与使用JOTM的Java服务进行整合。拥有JOTM的源代码还可以帮助你在遇到问题时进行更深入的排查和定制,以满足特定的业务需求。

    Spring框架技术

    集成JOTM并使用JTA事务的步骤如下: 1. 添加必要的JOTM相关库到项目的类路径中,包括jotm.jar、xapool.jar、jotm_jrmp_stubs.jar、jta-spec1_0_1.jar以及connector-1_5.jar。 2. 创建JOTM配置文件,例如carol....

    java开源包1

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    简易搭建ssh 框架

    - **jotm.jar**:这是一个开源的JTA(Java Transaction API)实现,用于处理分布式事务。 - **ezmorph-1.0.4.jar**:这个库可能用于对象转换,帮助在不同数据格式间进行转换。 在搭建SSH框架时,通常需要以下步骤:...

    WEB开发相关的Transaction管理战略

    无论是使用容器环境如EJB 2.1或3.0,还是Spring框架环境,或者是基于Web容器如Tomcat或Jetty与Java Open Transaction Manager (JOTM)的组合,都需要一个事务策略来保证数据的一致性和完整性。 Java Transaction API...

    java开源包8

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包11

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包2

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包3

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包6

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包5

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包10

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包4

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包7

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包9

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包101

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

Global site tag (gtag.js) - Google Analytics