`
步青龙
  • 浏览: 295699 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
72ba33fb-eefe-3de1-bd65-82a6e579265d
Java面试
浏览量:0
社区版块
存档分类
最新评论

Spring跨库事务JOTM

阅读更多

添加配置文件ApplicationContext-jotm.xml到src下:

 

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">  
    <!-- XA Datasource -->  
    <bean id="datasource1" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">     
        <property name="uniqueResourceName">     
            <value>mysql/main</value>     
        </property>     
        <property name="xaDataSourceClassName">     
            <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>     
        </property>     
        <property name="xaDataSourceProperties">     
            <value>URL=jdbc:mysql://192.168.0.229:3306/hdb;user=root;password=root</value>     
        </property>     
        <property name="exclusiveConnectionMode">     
            <value>true</value>     
        </property>     
        <property name="connectionPoolSize">     
            <value>3</value>     
        </property>     
        <property name="validatingQuery">     
            <value>SELECT 1</value>     
        </property>     
    </bean>  
      
    <bean id="datasource2" class="com.atomikos.jdbc.SimpleDataSourceBean" init-method="init" destroy-method="close">     
        <property name="uniqueResourceName">     
            <value>mysql/news</value>  
        </property>     
        <property name="xaDataSourceClassName">     
            <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value>     
        </property>  
        <property name="xaDataSourceProperties">     
            <value>URL=jdbc:mysql://192.168.0.229:3306/hdb2;user=root;password=root</value>     
        </property>     
        <property name="exclusiveConnectionMode">     
            <value>true</value>     
        </property>     
        <property name="connectionPoolSize">     
            <value>3</value>     
        </property>     
        <property name="validatingQuery">     
            <value>SELECT 1</value>     
        </property>     
    </bean>  
      
    <bean id="template1" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="datasource1" />  
    </bean>  
      
    <bean id="template2" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="datasource2" />  
    </bean>  
          
    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">  
        <property name="forceShutdown"><value>true</value></property>  
    </bean>  
      
    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">  
        <property name="transactionTimeout" value="300"/>   
    </bean>  
  
    <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">  
        <property name="transactionManager"><ref bean="atomikosTransactionManager"  /></property>  
        <property name="userTransaction"><ref bean="atomikosUserTransaction"  /></property>  
    </bean>  
      
    <bean id="dao1" class="test.UserDao1">  
        <property name="jdbcTemplate">  
            <ref bean="template1"></ref>  
        </property>  
    </bean>  
      
    <bean id="dao2" class="test.UserDao2">  
        <property name="jdbcTemplate">  
            <ref bean="template2"></ref>  
        </property>  
    </bean>  
    <!-- -->  
    <bean id="userServiceTarget" class="test.UserServiceImpl">  
        <property name="dao1" ref="dao1"/>  
        <property name="dao2" ref="dao2"/>  
    </bean>  
      
    <bean id="userTest" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">      
        <property name="transactionManager">  
            <ref bean="springTransactionManager"/>  
        </property>      
        <property name="target">  
            <ref bean="userServiceTarget"/>  
        </property>  
        <property name="transactionAttributes">          
            <props>  
                <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>              
            </props>  
        </property>  
    </bean>  
</beans>  

carol.properties放在src下:

 

carol.start.jndi=false            
carol.start.ns=false     
carol.jndi.java.naming.factory.url.pkgs=org.apache.naming

 jta.properties也放在src下:

 

com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory  
com.atomikos.icatch.console_file_name = tm.out  
com.atomikos.icatch.log_base_name = tmlog  
com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm  
com.atomikos.icatch.console_log_level =INFO 

 到此配置成功,下面是测试

 Userdao1

 

public class UserDao1 extends JdbcDaoSupport {  
    public void insertData(String id, String name) {  
    	String sxqlString = "insert into xa_test(id,name) values('" + id + "','" + name + "')";
    	System.out.println("打印sql:  "+sxqlString);
        getJdbcTemplate().execute(sxqlString);  
    }  
}  

 Userdao2

 

public class UserDao2 extends JdbcDaoSupport  
{  
    public void insertData(String id,String name){  
    	String sxqlString = "insert into xa_test(id,name) values('"+ id +"','"+name+"')";
    	System.out.println("打印sql:  "+sxqlString);
        getJdbcTemplate().execute(sxqlString);  
    }  
}  

 UserService

 

 

public interface UserService  
{  
    public void insertBothDatabase(String id,String name) throws Exception;  
    public void insert1Database(String id, String name)throws Exception;
    public void insert2Database(String id, String name)throws Exception;
} 

 UserServiceImpl

 

@Transactional
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 void insert1Database(String id, String name) throws Exception {  
        dao1.insertData(id, name);  
    }  
    public void insert2Database(String id, String name) throws Exception {  
        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;  
    }  
} 

 main方法测试,注意main方法的测试需要添加上相应的jar:

 

		ApplicationContext ctx = new FileSystemXmlApplicationContext(
				"classpath:ApplicationContext-jotm.xml");
		// 多库userTest  // 库2 userTest2
		UserService ut = (UserService) ctx.getBean("userTest2");
		try {
			//ut.insertBothDatabase("2", "11111111112222");
			String s = "111111111122222222223333333333";
			System.out.println(s.length());
			//ut.insertBothDatabase("3", s);
			//ut.insert2Database("2", "22222test");// 单独操作数据库2
		} catch (Exception e) {
			System.out.println("跨库事务回滚,两个库都未插入数据");
		} finally {
			System.out.println("结束");
		}

 而WEB服务器环境中可以用Action测试,超链接如下:

 

     	<br/><a href =  "/hpr/hcinfo/Com_showinfo.action?sid=ku2">只向库2添加数据</a>
  	<br/><a href =  "/hpr/hcinfo/Com_showinfo.action?sid=asdf">忘两个库都添加数据,都不是非法数据</a>
  	<br/><a href =  "/hpr/hcinfo/Com_showinfo.action?sid=yigefeifafa">忘两个库添加数据,符合库1添加数据要求,对库2是非法数据</a>

 测试代码:

 

ApplicationContext ctx = new FileSystemXmlApplicationContext(
		"classpath:ApplicationContext-jotm.xml");
		// 多库userTest  // 库2 userTest2
		String a="userTest";
		boolean boo = sid.equals("ku2");
		if (boo) {
			a = a+"2";
		}
		UserService ut = (UserService) ctx.getBean(a);
		try {
			//ut.insertBothDatabase("2", "11111111112222");
			String s = "111111111122222";
			if(boo){
				ut.insert2Database("2", s);// 单独操作数据库2
			}else{
				if(sid.equals("asdf")){
					ut.insertBothDatabase("3", s);
				}else{
					// 忘两个数据库插入非法数据,对库1符合要求,库2不符合要求
					ut.insertBothDatabase("3", s + s );
				}
			}
			//
		} catch (Exception e) {
			System.out.println("跨库事务回滚,两个库都未插入数据");
		} finally {
			System.out.println("结束");
		}

 

WEB服务器是tomcat,一开始我把所有的jotm的jar都放进来啦,但是我发现我一个一个去了之后都丝毫不影响。到spring的jar包一看,spring-tx-2.5.6.jar竟然有支持JTOM的类,org.springframework.transaction.jta.JotmFactoryBean.class 遂恍然大悟,Spring真是强大无比。所以我没有添加任何的其他的jar。两个数据库的表都是xa_test(id,name)不同的是库1的name长度为40,而库2的长度为20. 两个库同事操作的时候如果其中一个库不符合要求,两个库的操作都不执行。这也是所谓的跨库事务。

分享到:
评论

相关推荐

    spring + JTA + JOTM实现分布式事务

    本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java Open Transaction Manager (JOTM) 来实现这样的分布式事务管理。 首先,我们来了解一下JTA。JTA是Java平台的标准事务API,它允许应用程序...

    spring-hibernate-jotm 例子

    在压缩包中的“spring-transaction”可能包含了Spring的事务管理相关库,例如spring-tx模块,它提供了对声明式和编程式事务管理的支持。而“jotm-2.0.10”则是JOTM的具体版本,包含其核心组件和必要的依赖,用于在...

    Java分布式开发spring+jta+jotm

    "Java分布式开发spring+jta+jotm"的主题涵盖了Spring框架在分布式系统中的应用,特别是如何利用JTA和JOTM来处理跨资源的分布式事务。理解和掌握这些技术对于构建可扩展、健壮的Java应用至关重要。通过深入学习和实践...

    Spring+JOTM 分布式事务管理

    Spring事务管理:** Spring 提供了声明式和编程式的事务管理。声明式事务管理是通过在配置文件或注解中声明事务属性,如传播行为、隔离级别、超时和回滚规则,从而实现事务管理。这使得开发者无需在业务逻辑代码中...

    spring JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    Spring框架提供了对JTA(Java Transaction API)的支持,允许开发者处理跨多个数据存储的事务一致性。本文将深入探讨如何在Tomcat应用服务器上集成JTA,并使用JOTM(Java Open Transaction Manager)或Atomikos作为...

    spring 3.0.5 + jotm 实现的的spring mvc 的例子

    这个项目可能旨在演示如何在Spring MVC环境中配置和管理事务,特别是使用JOTM作为外部事务管理器来处理数据库操作。 **Spring MVC框架**: Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序。它提供了...

    多数据源 更新 spring jta java jotm

    JOTM是一个开源的Java事务管理器,符合X/Open XA规范,可以处理跨多个资源的事务。 要在Spring中配置JOTM,首先添加JOTM和Spring的JTA依赖到项目中。然后,定义一个`PlatformTransactionManager` bean,使用`...

    spring+jotm 多数据源事务管理(二)hibernate

    然后,你可以使用`HibernateTransactionManager`,但要注意将其与JOTM的事务管理器配合使用,以确保跨数据源的事务一致性。 总结来说,Spring结合JOTM和Hibernate进行多数据源事务管理,主要涉及以下几个步骤:配置...

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

    ### Spring + JOTM 多数据源事务管理详解(三):JNDI + Tomcat 在本篇文章中,我们将深入探讨如何利用Spring框架结合JOTM(Java Open Transaction Manager)来实现多数据源下的分布式事务管理。我们将通过具体实例...

    Spring分布式事务实现

    在Spring中集成JOTM,可以利用其功能来管理跨数据库的事务。 JOTM相关的jar包包括`jotm-core.jar`,`xapool.jar`,`ow2-connector-1.5-spec.jar`和`ow2-jta-1.1-spec.jar`。这些库提供了JOTM的核心实现和连接池支持...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...

    Spring+Jotm+Hibernate+Oracle+Junit 实现JTA分布式事务要求Demo工程

    2.Spring+Jotm整合实现JTA分布式事务,应用场景如转账等,同一事务内完成db1用户加100元、db2用户减100元。 3.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 (特别注意:Spring3.0里不在提供对jotm的...

    JOTM简单测试DEMO(不含jar包)

    JOTM作为一个事务协调者,负责管理跨多个资源的事务,确保它们要么全部成功,要么全部失败,这就是ACID(原子性、一致性、隔离性、持久性)原则的体现。在Spring框架中,我们可以利用Spring的声明式事务管理,通过...

    Spring-test做数据库操作的单元测试2-跨库访问

    综上所述,"Spring-test做数据库操作的单元测试2-跨库访问"这个主题涵盖了许多关键概念,包括Spring-test的运行机制、多数据源配置、事务管理以及测试的准备与清理。这些知识点对于开发涉及跨库操作的应用程序,确保...

    开源事务管理器 JOTM.7z

    在实际应用中,JOTM 可能会与诸如 Spring 框架等进行整合,Spring 提供的事务管理抽象层使得与 JOTM 的集成变得更加简单。开发者可以利用 Spring 的 `@Transactional` 注解来自动管理事务的边界,提高代码的可读性...

    在Spring中使用JTA事务管理

    本文将详细介绍如何在Spring中使用JTA事务管理,包括通过集成JOTM(Java Open Transaction Manager)以及引用Tomcat的JTA事务。 ### 1. 通过集成JOTM,直接在Spring中使用JTA事务 #### 1.1. 添加JOTM类库到类路径...

Global site tag (gtag.js) - Google Analytics