跨库事务处理 spring+hibernate+struts2+jta

跨库事务处理 spring+hibernate+struts2+jta

 
       最近做东西,不想数据太集中,所以将数据分散到多个数据库中,但是往多个数据库中插入数据是在是很痛苦的一件事,因为涉及到事务的一致性问题,比如我把用户和图书的表分开来存,当某个用户存一本书的时候,我必须修改用户的最后更新时间,和书的内容,一旦其中一个更新失败,都需要回滚。
 
        参考了一下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 testclass 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("fenglingcompany");
  introduce i=new introduce(); 
  i.setName("fengling"); 
  myService service=(myService)factory.getBean("myService");
/**
这里我测试了两次
service.saveSomthing(p, i);
能够成功保存,
如果使用
service.saveSomthing(p, null);
则两个数据都保存不上
*/
  service.saveSomthing(p, i);
 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值