JOTM分布式事务管理(多数据源)配置
项目接近尾声,老大让我们几个研究一些新技术,以便为将来项目的扩展做打算,我被分配到JOTM这一块。说实话,自己对分布式事务也不了解,至于JTA,只是了解概念。
至于什么是JOTM、JOTM有什么用,大家可以访问/index.html或者百度、google。趁着周末闲,于是搞了个DEMO。这个demo是用spring和jotm实现,数据库采用的oracle.本文只做简单的配置介绍,以及实现基本的同步回滚、提交效果。
首先,下载jar包,我的项目用的jar包如下:
基本上就是spring、JOTM以及oracle驱动jar包。
其次:引入carol.properties log4j.properties两个配置文件,这些文件可以再下载的JOTM的conf目录里到。同时,新建一个spring的配置文件,用来初始化数据源之类的。
这是我的文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:aop="/schema/aop"
xmlns:tx="/schema/tx"
xsi:schemaLocation="
/schema/beans /schema/beans/spring-beans-2.5.xsd
/schema/tx /schema/tx/spring-tx-2.5.xsd
/schema/aop /schema/aop/spring-aop-2.5.xsd">
springframework事务<bean id="jotm" class="ansaction.jta.JotmFactoryBean" />
<bean id="txManager" class="ansaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm" />
</bean>
<bean id="topicDS"
class="hydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
<property name="dataSource">
<bean class="hydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown">
<property name="transactionManager" ref="jotm" />
<property name="driverName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.7.223:1521:ORCL" />
</bean>
</property>
<property name="user" value="crmg1" />
<property name="password" value="crmg" />
</bean>
<bean id="postDS" class="hydra.jdbc.pool.StandardXAPoolDataSource"
destroy-method="shutdown">
<property name="dataSource">
<bean class="hydra.jdbc.standard.StandardXADataSource"
destroy-method="shutdown">
<property name="transactionManager" ref="jotm" />
<property name="driver
Name" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.7.223:1521:ORCL" />
</bean>
</property>
<property name="user" value="crm20120224" />
<property name="password" value="crm" />
</bean>
<bean id="topicTemplate"
class="org.JdbcTemplate">
<property name="dataSource" ref="topicDS" />
</bean>
<bean id="postTemplate"
class="org.JdbcTemplate">
<property name="dataSource" ref="postDS" />
</bean>
<bean id="topicDao" class="st.Dao1ServiceImpl">
<property name="jdbcTemplate" ref="topicTemplate" />
<property name="dao2Service" ref="postDao" />
</bean>
<bean id="postDao" class="st.Dao2ServiceImpl">
<property name="jdbcTemplate" ref="postTemplate" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
</beans>
我配置了两个oracle的数据源。两个数据源都交给JOTM来管理。同时有两个service:Dao1ServiceImpl\Dao2ServiceImpl分别操作两个数据源的表。为这两个service添加事务
两个service实现如下:
st;
import org.JdbcTemplate;
public class Dao1ServiceImpl implements IDao1Service {
private JdbcTemplate jdbcTemplate;
private IDao2Service dao2Service;
public IDao2Service getDao2Service() {
return dao2Service;
}
public void setDao2Service(IDao2Service dao2Service) {
this.dao2Service = dao2Service;
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void add() {
String str = "insert into t_staff(PK_ID,NAME,STAFF_TYPE,IS_DISABLE) values(2,'wyb','客服','0')";
jdbcTemplate.update(str);
int i=5/0;
dao2Service.add();
}
}
st;
import org.JdbcTemplate;
public class Dao2ServiceImpl implements IDao2Service {
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void add() {
String str = "insert into t_user values(200,'wyb','123','0',null,null,null,null)";
jdbcTemplate.update(str);
}
}
把service1的add方法和service2的add方法在service1中调用service2的方法,同时让service1出现异常,这样在分布式事务的情况下会得到结果:两条数据都米有插入成功,同时回滚。
测试类:
public class TestJOTM {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("l", TestJOTM.class);
IDao1Service d1 = (Bean("topicDao");
try{
d1.add();
}catch (Exception e) {
// TODO: handle exception
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论