`
sun201200204
  • 浏览: 294876 次
  • 性别: 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+hibernatet 搞定分布式事务

    spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务spring2.5+hibernatet 搞定分布式事务

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

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

    Spring2.5+hibernate搞定分布式事务

    Spring2.5+hibernate搞定分布式事务Spring2.5+hibernate搞定分Spring2.5+hibernate搞定分布式事务布式事务 第三部分

    Spring2.5和Hibernate3集成--学习spring aop ioc

    Spring2.5和Hibernate3集成 采用声明式事务 1.声明式事务的配置 * 配置sessionFactory * 配置事务管理器 * 配置事务的传播特性 * 配置哪些类哪些方法使用事务 2.编写业务逻辑方法 * 继承...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

    13) spring-mock.jar需spring-core.jar,spring-beans.jar,spring-dao.jar,spring-context.jar,spring-jdbc.jarspring2.0和spring2.5及以上版本的jar包区别Spring 2.5的Jar打包 在Spring 2.5中, Spring Web MVC...

    spring2.5+Hibernate3.3五种声明式事务处理 + 所需Jar

    spring2.5 + hibernate3.3 声明式事务 和所需jar包,spring2.5 + hibernate3.3 声明式事务 和所需jar包,spring2.5 + hibernate3.3 声明式事务 和所需jar包,

    spring2.5的单独应用

    有很多新手不会分离spring的包而...吾将spring2.5的包分离出来欲给一些人以方便。只需下载该包添加到项目中引用即可,如果单独用spring管理事务,记住用JdbcTemplate来获取数据源对象。 再附xml配置文件一个,以供参考

    Spring2.5中文版.zip

    Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。Spring提供了全功能的 MVC framework, 以及透明集成AOP到你...

    struts2.2.3+spring2.5+hibernate3.2事务

    struts2.2.3+spring2.5+hibernate3.2事务 有所用到的JAR

    spring2.5 hibernate3.2 事务

    NULL 博文链接:https://zw7534313.iteye.com/blog/421679

    spring2.5.chm帮助文档(中文版)

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    spring2.5学习PPT 传智博客

    spring2.5学习PPT 传智博客 01_全面阐释Spring及其各项功能 02_搭建与测试Spring的开发环境 03_编码剖析Spring管理Bean的原理 04_Spring的三种实例化Bean的方式 05_配置Spring管理的bean的作用域 06_Spring...

    Spring2.5 Framework 开发参考手册中文版

    Spring为编写企业应用程序提供了轻量的解决方案,同时仍然支持使用声明式事务、 用RMI或web service远程调用、以及使用多种方式来将数据持久化到数据库。Spring提供了全功能的 MVC framework, 以及透明集成AOP到你...

    Spring2.5实例

    本实例是一个Spring与Hibernate结合的例子,很好地展示了用Spring的Ioc容器来灵活地定义Bean实现DAO和使用Spring的AOP实现事务管理。

    Spring2.5学习笔记

    基于 Spring2.5.6 包含Spring2.5中的信赖注入、AOP、事务管理等较全面的内部。

    Spring2.5的新特性

    &lt;br&gt;新发布的Spring2.5继续坚持了这个发展趋向,特别是为那些使用Java 5或更新版本java的开发人员提供了进一步简化而强大的新特性。这些新特性包括:注解驱动的依赖性注入(annotation-driven dependency ...

    Spring2.5_JPA_Transaction_Demo

    这是Spring2.5集成JPA的有关事务的例子,挺实用的哦!

    ssh搭建案例 spring2.5 hibernate3.1 struts1.2

    这是一个spring2.5+hibernate3.1+struts1.2的搭建案例,主要是一个转帐的案例,通过spring添加事务

    Spring 2.5整合iBATIS 2.3并使用Spring的声明式事务管理

    NULL 博文链接:https://ymgjava.iteye.com/blog/1117624

Global site tag (gtag.js) - Google Analytics