spring+jta实现全局事物管理

45 篇文章 1 订阅
6 篇文章 0 订阅

        在上个公司由于项目的需要,新做的电子商务网站要与一个返款系统(之前做的)进行集成,要求新做的电子商务网站能够调用并修改返款系统的数据,当然这个两个数据库(oracle),部署在redhat tomcat下面,由于tomcat本身并不支持jta事物,加上项目用的是spring,因此在网上打捞一番后就用了jotm。

       JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,本身也是开源应用程序服务器JOnAS(Java Open Application Server)的一部分,为其提供JTA分布式事务的功能。Spring对JOTM提供了较好的支持,提供了一个org.springframework.transaction.jta.JotmFactoryBean的支持类,在Spring2.0中也包含了JOTM相关的一些library。
jotm的下载地址为
http://jotm.objectweb.org,最新版本为JOTM_2_2_1.
下载完成后解压缩,然后打开jotm下面conf文件夹,拷贝carol.properties文件到classpath中,并修改这个文件如下

carol.properties

# jonas rmi acativation (iiop, irmi, jrmp, cmi)
carol.protocols=jrmp

carol.start.jndi=false

carol.start.ns=false

上面配置文件的目的是不使用JNDI的方式来加载JOTM的配置,当然也可以根据需要选择其它的一些配置。

然后开始在Spring上下文中配置JOTM,在classpath中建立一个ApplicationContext-jotm.xml,配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">


	<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />
	
	<bean id="txManager"
		class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="userTransaction" ref="jotm" />
	</bean>
	
	<bean id="ds244" 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="oracle.jdbc.driver.OracleDriver" />
				<property name="url"
					value="jdbc:oracle:thin:@192.168.1.244:1521:db" />
			</bean>
		</property>
		<property name="user" value="user11" />
		<property name="password" value="123" />
	</bean>

	
	<bean id="ds110" 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="oracle.jdbc.driver.OracleDriver" />
				<property name="url"
					value="jdbc:oracle:thin:@192.168.1.110:1521:shopdb" />
			</bean>
		</property>
		<property name="user" value="user1" />
		<property name="password" value="123" />
	</bean>

	
	<bean id="template110" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="ds110" />
	</bean>
	
	<bean id="template244" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="ds244" />
	</bean>



	<bean id="dao110" class="dao.Dao110">
		<property name="jdbcTemplate" ref="template110" />
	</bean>
	<bean id="dao244" class="dao.Dao244">
		<property name="jdbcTemplate" ref="template244" />
	</bean>

	<bean id="jtaService" class="service.JtaService">
		<property name="dao110" ref="dao110" />
		<property name="dao244" ref="dao244" />
	</bean>

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


说明:

这里配置了两个标准的xa数据源,以及两个dao,具体代码如下:

Dao110.java

package dao;

import org.springframework.jdbc.core.JdbcTemplate;

public class Dao110 {
	private JdbcTemplate jdbcTemplate;

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	public void changeName()
	{
		System.out.println("110 begin:"+this.jdbcTemplate);
		
	//	jdbcTemplate.update("update aduser set username='admin' where id=92");//不可执行
		
		jdbcTemplate.update("update aduser set username='adminddddd' where id=92");
		System.out.println("110 after");
	}
	

}


Dao244.java

package dao;

import org.springframework.jdbc.core.JdbcTemplate;

public class Dao244 {
	private JdbcTemplate jdbcTemplate;

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public void changeName()
	{
		System.out.println("244 begin:"+this.jdbcTemplate);
	//	jdbcTemplate.update("update aduser set username='zwls' where id=68");//不可执行
		jdbcTemplate.update("update aduser set username='zwlsdasdsadsadad' where id=68");
		
		System.out.println("244 after");
	}

}


JtaService.java

package service;

import org.springframework.transaction.annotation.Transactional;

import dao.Dao110;
import dao.Dao244;


@Transactional/* ①事务注解,以便Spring动态织入事务管理功能*/
public class JtaService {
	private Dao110 dao110;
	private Dao244 dao244;
	
	
	
	
	
	public void jtaTest()
	{
		System.out.println("jtatest");
		System.out.println("dao110:"+dao110);
		System.out.println("dao244:"+dao244);
		dao110.changeName();
		dao244.changeName();
	}
	
	
	
	
	
	

	public Dao110 getDao110() {
		return dao110;
	}

	public void setDao110(Dao110 dao110) {
		this.dao110 = dao110;
	}

	public Dao244 getDao244() {
		return dao244;
	}

	public void setDao244(Dao244 dao244) {
		this.dao244 = dao244;
	}

}

JtaAction.java

package action;

import service.JtaService;

import com.opensymphony.xwork2.ActionSupport;

public class JtaAction extends ActionSupport{
 
 private JtaService jtaService;
 
 @Override
 public String execute() throws Exception {
  
  
  System.out.println("execute");
  
  System.out.println("jtaService"+jtaService);
  try {
   jtaService.jtaTest();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   
   System.out.println("ExceptionExceptionExceptionExceptionException");
  }
  
  return super.execute();
 }

 public JtaService getJtaService() {
  return jtaService;
 }

 public void setJtaService(JtaService jtaService) {
  this.jtaService = jtaService;
 }
 
 
 

}


 





 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值