`

jtom 分布式事务 配置小记

 
阅读更多

Spring 通过AOP技术可以让我们在脱离EJB的情况下享受声明式事务的丰盛大餐,脱离Java EE应用服务器使用声明式事务的道路已经畅通无阻。但是很大部分人都还认为脱离Java EE应用服务器就无法使用JTA事务,这是一个误解。其实,通过配合使用ObjectWeb的JOTM开源项目,不需要Java EE应用服务器,Spring也可以提供JTA事务。

?正因为AOP让Spring拥有了脱离EJB容器的声明式事务能力,而JOTM让我们在脱离Java EE应用服务器下拥有JTA事务能力。所以,人们将AOP和JOTM称为Java软件开发的两个圣杯。

?本文将讲解Spring在不同环境下提供JTA事务的配置过程,这包括:Spring中直接集成JOTM提供JTA事务管理、将JOTM集成到Tomcat中,Spring通过引用Tomcat JNDI数据源提供JTA事务管理、引用其他功能完善JavaEE应用服务器所提供的JTA事务管理。

  通过集成JOTM,直接在Spring中使用JTA事务

  JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA分布式事务的功能。

  Spring 2.0附带的依赖类库中虽然包含jotm类库,但是并不完整,你可以到http://jotm.objectweb.org下载完全版的JOTM。

  Spring为JOTM提供了一个org.springframework.transaction.jta.JotmFactoryBean支持类,通过该支持类可以方便地创建JOTM本地实例。

?下面,我们通过配置,使上节中BbtForumImpl#addTopic()方法工作在JTA事务的环境下。addTopic()内部使用两个DAO类(TopicDao和PostDao)分别访问不同数据库中的表。通过下面的步骤说明了使addTopic()方法拥有JTA事务的整个过程:

?

  1. 将JOTM以下类库添加到类路径中:

  jotm.jar

  xapool.jar

  jotm_jrmp_stubs.jar

  jta-spec1_0_1.jar

  connector-1_5.jar

  2. 编写JOTM配置文件,放到类路径下

  carol.properties

  #JNDI调用协议

  carol.protocols=jrmp

  #不使用CAROL JNDI封装器

  carol.start.jndi=false

  #不启动命名服务器

  carol.start.ns=false

  3. 在MySQL上建立两个数据库

  在MySQL数据库中运行SQL脚本,建立topicdb和postdb两个数据库,在topicdb数据库中创建t_topic表,在postdb数据库中创建t_post表。我们希望在这两个数据库上进行JTA事务。SQL脚本如下所示:


DROP DATABASE IF EXISTS topicdb;
CREATE DATABASE topicdb DEFAULT CHARACTER SET utf8;
USE topicdb;
drop table if exists t_topic;
create table t_topic
(
topic_id int(11) not null auto_increment,
forum_id int(11) not null default 0,
topic_title varchar(100) not null default '',
user_id int(11) not null default 0,
topic_time datetime default NULL,
topic_views int(11) default 1,
topic_replies int(11) default 0,
primary key (topic_id)
);
create index IDX_TOPIC_USER_ID on t_topic
(
user_id
);

 


DROP DATABASE IF EXISTS postdb;
CREATE DATABASE postdb DEFAULT CHARACTER SET utf8;
USE postdb;
create table t_post
(
post_id int(11) not null auto_increment,
topic_id int(11) not null default 0,
forum_id int(11) not null default 0,
user_id int(11) not null default 0,
post_text text,
post_attach blob,
post_time datetime default NULL,
primary key (post_id)
);
create index IDX_POST_TOPIC_ID on t_post
(
topic_id
);

?

  4. 在Spring配置文件中配置JOTM

代码清单 1 applicationContext-jta.xml

  …

  <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />①JOTM本地实例

  ②JTA事务管理器

  <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">

  <property name="userTransaction" ref="jotm" /> ②-1:指定userTransaction属性

  </bean>

  ③XAPool配置,内部包含了一个XA数据源,对应topicdb数据库

  <bean id="topicDS" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"

  destroy-method="shutdown">

  <property name="dataSource">

  ③-1:内部XA数据源

  <bean class="org.enhydra.jdbc.standard.StandardXADataSource"

  destroy-method="shutdown">

  <property name="transactionManager" ref="jotm" />

  <property name="driverName" value="com.MySQL.jdbc.Driver" />

  <property name="url" value="jdbc:MySQL://localhost:3309/topicdb" />

  </bean>

  </property>

  <property name="user" value="root" />

  <property name="password" value="1234" />

  </bean>

  ④按照③相似的方式配置另一个XAPool,对应postdb数据库,

?

<bean id="postDS" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
<property name="dataSource">
<bean class="org.enhydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown">
<property name="transactionManager" ref="jotm" />
<property name="driverName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3309/postdb" />
</bean>
</property>
<property name="user" value="root" />
<property name="password" value="1234" />
</bean>
⑤配置访问topicDB数据源的Spring JDBC模板

  <bean id="topicTemplate"

  class="org.springframework.jdbc.core.JdbcTemplate">

  <property name="dataSource" ref="topicDS" />

  </bean>

  ⑥配置访问postDB数据源的Spring JDBC模板

  <bean id="postTemplate"

  class="org.springframework.jdbc.core.JdbcTemplate">

  <property name="dataSource" ref="postDS" />

  </bean>

  ⑦基于topicTemplate数据源的topicDao

  <bean id="topicDao" class="com.baobaotao.dao.jdbc.TopicJdbcDao">

?

  <property name="jdbcTemplate" ref="topicTemplate" />

  </bean>

  ⑧基于postTemplate数据源的postDao

  <bean id="postDao" class="com.baobaotao.dao.jdbc.PostJdbcDao">

  <property name="jdbcTemplate" ref="postTemplate" />

  </bean>

  ⑨进行跨数据库JTA事务的业务类

  <bean id="bbtForum" class="com.baobaotao.service.impl.BbtForumImpl">

  <property name="topicDao" ref="topicDao" />

  <property name="postDao" ref="postDao" />

  </bean>

?⑩对BbtForumImpl业务类中的@Transaction注解进行驱动

  <tx:annotation-driven transaction-manager="txManager" />

?首 先,我们在①处通过Spring所提供的JotmFactoryBean创建一个本地JOTM实例,该实例同时实现了 javax.transaction.UserTransaction和javax.transaction.TransactionManager接 口,它可以和ObjectWeb的XAPool一起工

转自http://blog.knowsky.com/251544.htm

分享到:
评论

相关推荐

    开源分布式事务管理Jtom

    【标题】"开源分布式事务管理Jtom"是一个关键的话题,主要关注的是在Java环境中如何高效地管理和协调跨多个数据源的事务。Jtom,全称为Java Open Transaction Manager,是实现这一目标的重要工具。它是一个完全遵循...

    JTOM分布式事物配置

    NULL 博文链接:https://sd8089730.iteye.com/blog/1621382

    JTOM ccm_recover.

    JTOM(Java Transaction Object Manager)是一种用于管理事务处理的开源框架,它在分布式系统中扮演着重要角色。JTOM 提供了一种标准化的方式来处理事务,确保数据的一致性和完整性。在本文中,我们将深入探讨 `ccm_...

    java Tomcat6 JTOM Project

    在Tomcat6中配置好的java工程已经配置好JTOM的DataSource和UserTransaction,打包下载.请自行配置数据库与补全Tomcat6中的公共文件.然后就可以直接访问页页http://127.0.0.1:8080/DaoTemplate_my/books.jsp和...

    jotm-2.0.11.MR5.rar_Jotm jar_jotm_jotm-2.0.11.MR5_jotm.jar _jtom

    JOTM(Java Open Transaction Manager)是一款开源的事务管理器,专为Java应用程序设计,它提供了强大的事务处理能力,支持JTA(Java Transaction API)规范,使得在分布式环境中进行事务管理变得更加便捷。...

    spring+hibernate+jtom demo

    在本文中,我们将深入探讨如何使用Spring、Hibernate和JOTM进行分布式事务管理,以实现在一个Service方法中同时操作两个不同数据源的数据,并确保任何错误都能导致所有操作回滚。首先,我们需要了解这些技术的基本...

    JTA事务源码示例

    如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,欢迎下载传播。有问题请在评价中...

    jotm-2.0.11.MR5.tgz

    通过这些内容,开发者可以构建一个支持分布式事务处理的环境,特别是在Java应用服务器上,如Tomcat、JBoss等,JOTM能提供强大的事务管理能力,确保在复杂的网络环境中数据的一致性和完整性。了解并熟练使用JOTM,对...

    JOTM包

    JOTM 是一个基于Java开放源代码的事务处理管理器。它遵循JTA APIs规范与Business Transaction Protocol(BTP)规范以提供了对Web Service的支持。

    前后端分离的仓库物料管理系统(源代码+部署视频教程)

    8、默认登录账号密码:admin 123456 密码如果不对,就是 jtom123456 登录后 自己 修改一下 文件包含以下文件: 1、database(数据库设计文件) 2、ruoyi-master(后端代码) 3、ruoyi-ui(管理后台前端代码) ...

Global site tag (gtag.js) - Google Analytics