关于Spring JTA的介绍非常多了,这里就不再一再阐述其优越性怎么怎么了,直接开始正题。一个大致的需求如下,用户在进行增删改操作时,会同时更新2至3个数据库的数据表,操作需要事务来包裹,以便在操作其中一个数据库的数据表失败时,可以将其他数据库已执行的动作回滚。
由于主框架是Spring,所以将研究的重点放在Spring所提供的的JTA事务上,google了很多资料,发现有几种实现的技术,如JOTM,Atomikos,以及J2EE容器所提供的JTA实现,如JBOSS也都提供了JTA的实现,不过个人喜好来讲,非常厌恶使用JNDI来访问容器组件,所以,重点放在JOTM和Atoimikos两种技术上面,JOTM网上很多资料介绍,配置也非常简单,相信大家通过google就可以快速的上手,本着研究的原则,少少了解了另一种实现技术Atomikos,发现使用方法也很简单,下面就用一个简单的例子来详细说明一下他们在Spring中的配置和使用方法。需要说明的一点是,这个例子也是当时学习两种技术,然后测试的例子,仅仅最后做了一些整理。
初步的设想:一个包括Dao/Service/Test三层的简单应用,事务配置在service层.用来同时插入两个数据库(test,test2)的数据表xa_test,表结构非常简单,包含两个字段id,name,其中test2数据库中表xa_test的name字段不允许为空。
使用的数据库为Mysql 5.0,数据库连接驱动版本5.0.8,这里需要注意,过低版本的Mysql或驱动可能不支持XA Datasource。
Database test ddl
CREATE TABLE `xa_test` (
`id` int(11) NOT NULL,
`name` varchar(20) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Database test2 ddl
CREATE TABLE `xa_test` (
`id` int(11) NOT NULL,
`name` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
UserDao,这里使用了两个,UserDao1和UserDao2,用以操作两个不同数据库的数据表(画蛇添足了,呵呵,为了描述清晰).Dao都继承自Spring的JdbcDaoSupport,使用JdbcTemplate进行数据库读写.
UserDao1.java
package com.xa.dao;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class UserDao1 extends JdbcDaoSupport {
public void insertData(String id, String name) {
getJdbcTemplate().execute("insert into xa_test values('" + id + "'," + name + ")");
}
}
UserDao2.java
package com.xa.dao;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
public class UserDao2 extends JdbcDaoSupport
{
public void insertData(String id,String name){
getJdbcTemplate().execute("insert into xa_test values('"+ id +"',"+name+")");
}
}
然后创建UserService和UserServiceImpl,在UserServiceImpl中,将调用Dao1和Dao2的insertData的方法同时插入两个数据库的内容,稍后,会将事务配置在service层.
UserService.java
package com.xa.service;
public interface UserService
{
public void insertBothDatabase(String id,String name) throws Exception;
}
UserServiceImpl.java
package com.xa.service;
import com.xa.dao.UserDao1;
import com.xa.dao.UserDao2;
public class UserServiceImpl implements UserService
{
private UserDao1 dao1;
private UserDao2 dao2;
public void insertBothDatabase(String id, String name) throws Exception {
dao1.insertData(id, name);
dao2.insertData(id, name);
}
public UserDao1 getDao1() {
return dao1;
}
public void setDao1(UserDao1 dao1) {
this.dao1 = dao1;
}
public UserDao2 getDao2() {
return dao2;
}
public void setDao2(UserDao2 dao2) {
this.dao2 = dao2;
}
}
UserServiceImpl.java的代码可以看到,在insertBothDatabase方法中,调用了两个Dao的方法.
一个简单的应用已经建立,随后下一节将说明如何配置JOTM以及在Spring中的相关配置.
分享到:
相关推荐
NULL 博文链接:https://zhaoshijie.iteye.com/blog/1836707
Java分布式开发spring+jta+jotm,可用 Java分布式开发spring+jta+jotm,可用
多数据源 更新 spring jta java jotm
NULL 博文链接:https://onlyor.iteye.com/blog/1483289
spring + JTA + JOTM实现分布式事务, 高大上的技术
spring + JTA + atomikos实现分布式事务, 高大上的技术
springboot+jta+atomikos Springboot+atomikos+jta实现分布式事务统一管理
Spring Boot Jta Atomikos样本 Spring Boot Jta Atomikos样本 描述 这是一个示例示例项目,使用spring boot,jta和atomikos演示了分布式事务的工作方式。 该项目有两个mysql数据库,db:atomikos_one保留大写信息,...
Spring+iBatis+JOTM实现JTA事务 spring ibatis jotm 分布 事务 多数据源
2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...
NULL 博文链接:https://liangzhijian.iteye.com/blog/1404534
1 通过集成JOTM,直接在Spring中使用JTA事务 1.1. 将JOTM以下类库添加到类路径中 1.2. 编写JOTM配置文件,放到类路径下 1.3. 在MySQL上建立两个数据库 1.4. 在Spring配置文件中配置JOTM 1.5. 在Spring中运行测试 2 ...
Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源,分别向两个不同的数据里面插入数据同时失败和成功,调用接口方式原理一样。
春天jta-narayana JTA,JPA,Hibernate和Atomikos的Spring项目。 参考:
NULL 博文链接:https://injavawetrust.iteye.com/blog/2308552
jta Springboot + Atomikos + Druid + Mysql 实现JTA分布式事务 问题一:Druid 和 Mysql 版本的问题 问题二:Springtest 默认情况下事务回滚 Mysql对XA协议支持不好,有待看
1.利用mina框架重构api,脱离了web应用服务器resin,而原api的jta事务由resin支持,故需要用其他支持jta事务的工具重新配置。在支持jta事务的工具中选择了atomikos 2.Api的数据库连接配置参数没有类似:testQuery的...
JavaWeb项目整合jta跨库事务时用的atomikos第三方组件所需的jar包,前一阵找了好久才凑全,现在已经成功用在项目里面了,希望方便大家~
多数据源事务可采用jta+atomikos方式来解决事务问题。