`
sun201200204
  • 浏览: 299420 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring2.5跨库事务处理

    博客分类:
  • j2ee
阅读更多
不知道spring的事务支持跨库数据处理吗?明天试下。

查了下资料:
跨库事务处理 spring+hibernate+struts2+jta
http://huqilong.blog.51cto.com/53638/109109

最近做东西,不想数据太集中,所以将数据分散到多个数据库中,但是往多个数据库中插入数据是在是很痛苦的一件事,因为涉及到事务的一致性问题,比如我把用户和图书的表分开来存,当某个用户存一本书的时候,我必须修改用户的最后更新时间,和书的内容,一旦其中一个更新失败,都需要回滚。

        参考了一下spring的文档“事务策略”部分的内容,终于有了点想法:
        首先让我们来配置两个数据源:
              两个数据库 jtatest1和jtatest2
              分别有两个表,jtatest1.product和jtatest2.introduce
              
-- Table "product" DDL
CREATE TABLE `product` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) collate utf8_unicode_ci default NULL,
  `introduceId` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- Table "introduce" DDL
CREATE TABLE `introduce` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

<!-- 配置两个数据源 -->
<bean id="dataSource1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://37.17k.com:3306/jtatest1?useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
     <property name="maxActive" value="400"/>
     <property name="maxIdle" value="30"/>
     <property name="maxWait" value="30000"/>
        <!--property name="validationQuery" value="select current_date()"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
        <property name="testWhileIdle" value="true"/-->
   </bean>
     <bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://35.17k.com:3306/jtatest?useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
     <property name="maxActive" value="400"/>
     <property name="maxIdle" value="30"/>
     <property name="maxWait" value="30000"/>
        <!--property name="validationQuery" value="select current_date()"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
        <property name="testWhileIdle" value="true"/-->
   </bean>
  
   <!-- 两个sessionFactory -->
  <bean id="mySessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <property name="dataSource" ref="dataSource1"/>
     <property name="mappingResources">
       <list>
         <value>/test/model/product.hbm.xml</value>
       </list>
     </property>
     <property name="hibernateProperties">
        <value>
          hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
                hibernate.show_sql=true
        </value>
     </property>
   </bean>
   <bean id="mySessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <property name="dataSource" ref="dataSource2"/>
     <property name="mappingResources">
       <list>
         <value>/test/model/Introduce.hbm.xml</value>
       </list>
     </property>
     <property name="hibernateProperties">
        <value>
          hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
                hibernate.show_sql=true
        </value>
     </property>
  </bean>
  <!-- 定义两个DAO -->
  <bean id="myProductDao" class="test.dao.myProductDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory1"/>
  </bean>
  <bean id="introduceDao" class="test.dao.introduceDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory2"/>
  </bean>

然后我们来定义事务:

<!-- 事务管理 -->
  <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />
  <bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager">
   <property name="userTransaction" ref="jotm" />
  </bean>
  <bean id="myService"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager" ref="myTxManager"/>
    <property name="target">
      <bean class="test.service.myServiceImpl">
        <property name="myProductDao" ref="myProductDao"/>
        <property name="introduceDao" ref="introduceDao"/>
      </bean>
    </property>
   <property name="transactionAttributes">
   <props>
    <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="excute*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="import*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="publish*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
</property>



现在可以测试了:

    
public class test extends HibernateDaoSupport{
private static Log log = LogFactory.getLog(test.class);
public static void main(String args[]){
  ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
  BeanFactory factory = context;
  product p=new product();
  p.setIntroduceId(1);
  p.setName("鸡肉");
  introduce i=new introduce(); 
  i.setName("大大牌鸡肉"); 
  myService service=(myService)factory.getBean("myService");
/**
这里我测试了两次
service.saveSomthing(p, i);
能够成功保存,
如果使用
service.saveSomthing(p, null);
则两个数据都保存不上
*/
  service.saveSomthing(p, i);
}
}

缺点:使用xml太复杂了。
分享到:
评论

相关推荐

    Spring2.5-中文参考手册chm

    它提供了模板类和回调接口,简化了数据库操作,并通过声明式事务管理进一步降低了事务处理的复杂性。 **Bean的生命周期管理** Spring管理的Bean有其特定的生命周期,包括初始化、正常使用和销毁。在Spring 2.5中,...

    spring2.5的所有jar包

    2. **AOP(面向切面编程)**:Spring 2.5支持更强大的AOP功能,允许开发者定义和执行横切关注点,如日志、事务管理等,这些关注点可以独立于业务逻辑进行处理。 3. **XML配置增强**:在Spring 2.5中,XML配置文件...

    Spring2.5 源代码

    Spring 2.5的事务管理是另一个重要的功能,它支持编程式和声明式事务管理,确保了在多层架构中的数据一致性。 通过对Spring 2.5源代码的深入研究,开发者不仅可以了解其工作原理,还能学习到良好的设计模式和最佳...

    spring 2.5中文帮助文档

    通过阅读《Spring2.5-中文参考手册.chm》这份文档,开发者可以深入了解Spring 2.5的各种特性和用法,解决实际开发中遇到的问题,提升开发效率。文档不仅包含详细的API参考,还包含丰富的示例和最佳实践指导,是学习...

    spring 2.5框架图

    Spring 2.5在ORM方面的改进包括对JPA 2.0的支持和更灵活的事务策略。 6. **UML框架图**:提供的"spring 2.5框架图"很可能是用UML(统一建模语言)绘制的,它展示了Spring 2.5各模块之间的关系和交互。通过这样的...

    Spring2.5-中文参考手册chm.zip

    引入了`@Transactional`注解,允许在方法级别声明事务管理,简化了事务处理代码。 5. **容器改进**:Spring 2.5的IoC容器增强了对Java 5和6特性的支持,如泛型和注解。同时,提供了更强大的Bean定义合并功能,使得...

    Spring2.5 中文文档 chm格式

    Spring2.5版本是该框架的一个重要里程碑,引入了许多改进和新特性,为开发者提供了更丰富的功能和更好的灵活性。这个"Spring2.5中文框架开发手册"旨在帮助中国开发者更好地理解和应用Spring框架,尤其是对于那些不...

    spring2.5必备jar包

    然而,在Spring 2.5时代,JOTM和`JotmFactoryBean`是进行分布式事务处理的一个实用选择。 除了这些,Spring 2.5还引入了对Java Persistence API (JPA) 的全面支持,允许开发者利用ORM(对象关系映射)技术进行数据...

    struts1.2 + spring2.5 + hibernate3.2框架demo

    Struts1.2、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,它们各自在应用程序的不同层次上发挥着重要作用。Struts1.2是一个MVC(Model-View-Controller)框架,主要负责处理用户界面与业务逻辑之间的...

    spring2.5中文文档

    2. **AOP(Aspect-Oriented Programming, 面向切面编程)**:Spring 2.5支持AOP,允许开发者定义横切关注点,如日志、事务管理等,这些关注点可以被织入到多个业务对象中,降低了代码的冗余。 3. **XML配置与注解...

    struts2.1+spring2.5+hibernate3.3整合之第一步(spring2.5+hibernate3.3)

    Spring2.5是全面的企业级应用框架,它不仅包含IoC(Inversion of Control,控制反转)容器,用于管理对象的生命周期和依赖关系,还提供了AOP(Aspect-Oriented Programming,面向切面编程)功能,实现了对横切关注点...

    Spring 2.5 AOP 例子

    Spring 2.5 AOP(面向切面编程)是Java应用程序中的一个重要概念,它允许开发者在不修改原有代码的情况下插入新的行为或监控。这个例子旨在帮助我们理解和应用Spring框架的AOP特性。以下是对该主题的详细解释: 一...

    Spring2.5实现事务管理(本地事务、分布式事务).doc

    Spring 2.5 实现事务管理(本地事务、分布式事务) Spring 框架提供了对事务管理的支持,它可以使得事务的管理变得更加简洁和灵活。事务管理是指在多个操作中维持一致性的机制,它可以确保在多个操作中,如果某个...

    spring2.5常用包

    Spring 2.5 是 Spring 框架的一个重要版本,它在之前的版本基础上引入了许多增强功能和改进,为开发者提供了更强大的工具集。这个压缩包包含的“spring常用包”很可能是为了帮助开发者理解并使用 Spring 2.5 的核心...

    spring2.5 hibernate3.2 事务

    标题中的“spring2.5 hibernate3.2 事务”涉及到的是两个关键的Java开发框架——Spring和Hibernate,以及它们在处理事务管理方面的整合。Spring是面向切面编程(AOP)的轻量级框架,提供了强大的事务管理功能;...

    spring2.5 mvc_ibatis2

    3. Spring 2.5新特性:支持JSR-303 Bean Validation,提供注解驱动的事务管理,增强了AOP支持,以及对注解配置的进一步强化。 二、iBatis 2介绍 1. iBatis概念:iBatis是一个基于Java的持久层框架,它允许开发者...

    Spring2.5

    此外,Spring的事务管理功能也使得跨库操作更加便捷。 六、Web应用支持 在Web开发方面,Spring 2.5集成了Struts等MVC框架,提供了Model-View-Controller的设计模式,使得业务逻辑、视图和控制层分离,降低了复杂性...

    传智播客 spring2.5源代码_lib包

    这个"传智播客 spring2.5源代码_lib包"包含了Spring框架2.5版本的库文件,这些库文件对于理解Spring的工作原理、学习如何使用它以及进行相关开发非常有帮助。下面我们将深入探讨Spring 2.5的一些核心概念和功能。 1...

    传智播客 黎活明spring2.5 ppt

    《传智播客 黎活明spring2.5 ppt》是针对Java开发人员的一个培训资料,由知名讲师黎活明主讲,主要讲解了Spring框架2.5版本的相关知识。Spring是一个开源的Java企业级应用框架,它为开发人员提供了一个全面的编程和...

    Spring2.5中文手册

    这个`Spring2.5中文手册`是一个非常有价值的参考资料,帮助开发者深入理解并有效地利用Spring框架。 1. **Spring概述** - Spring是一个开源的Java平台,它提供了全面的应用程序架构支持,简化了Java Enterprise ...

Global site tag (gtag.js) - Google Analytics