免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4068 | 回复: 0
打印 上一主题 下一主题

spring+hibernate+jotm分布式事务配置总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-14 09:26 |只看该作者 |倒序浏览
    两个不同网域的oracle数据库,处理之间的事务,
     spring+hibernate+jotm组合,
一、环境及框架
       Tomcat+spring+hibernate+jotm,struts,Oracle等
二、需求说明
      系统里有2套不同网域的oracle数据库,之间的数据需要进行交互。
三、Dao配置
       1、定义jtom Bean   
bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />  
       2、定义数据源
bean id="dataSourceA" 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 local="jotm" />   
            property>   
            property name="driverName">   
                value>oracle.jdbc.driver.OracleDrivervalue>   
            property>   
            property name="url">   
                value>jdbc:oracle:thin:@192.168.0.10:1521:Avalue>   
            property>   
        bean>   
    property>   
    property name="user">   
        value>value>   
    property>   
    property name="password">   
        value> value>   
    property>   
bean>   
   
   
bean id="dataSourceB" 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 local="jotm" />   
            property>   
            property name="driverName">   
                value>oracle.jdbc.driver.OracleDrivervalue>   
            property>   
            property name="url">   
                value>jdbc:oracle:thin:@192.168.0.10:1521:Bvalue>   
            property>   
        bean>   
    property>   
    property name="user">   
        value> value>   
    property>   
    property name="password">   
        value> value>   
    property>   
bean>   
       3、定义sessionFactory
xml 代码

bean id="sessionFactoryA" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
    property name="dataSource">   
        ref local="dataSourceA" />   
    property>   
    property name="mappingDirectoryLocations">   
        list>   
            value>classpath:/org/testa/hibernate/model/value>   
        list>   
    property>   
    property name="hibernateProperties">   
        props>   
            prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialectprop>   
            prop key="hibernate.show_sql">trueprop>   
            prop key="hibernate.jdbc.batch_size">50prop>   
            prop key="hibernate.cache.use_query_cache">trueprop>   
            prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProviderprop>   
        props>   
    property>   
    property name="jtaTransactionManager">   
        ref bean="jotm" />   
    property>   
    property name="lobHandler" ref="lobHandler"/>   
bean>        
           
bean id="sessionFactoryB" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
    property name="dataSource">   
        ref local="dataSourceB" />   
    property>   
    property name="mappingDirectoryLocations">   
        list>   
            value>classpath:/org/testb/hibernate/model/value>   
        list>   
    property>   
    property name="hibernateProperties">   
        props>   
            prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialectprop>   
            prop key="hibernate.show_sql">trueprop>   
            prop key="hibernate.jdbc.batch_size">50prop>   
            prop key="hibernate.cache.use_query_cache">trueprop>   
            prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProviderprop>   
        props>   
    property>   
    property name="jtaTransactionManager">   
        ref bean="jotm" />   
    property>   
    property name="lobHandler" ref="lobHandler"/>   
bean>  
       4、事务管理配置
xml 代码

bean id="myTransactionManager"   
    class="org.springframework.transaction.jta.JtaTransactionManager">   
    property name="userTransaction">   
        ref local="jotm" />   
    property>   
bean>  
       5、dao的配置
xml 代码

bean id="testADaoTarget" class="org.testa.hibernate.dao.impl.TestADAO">   
property name="sessionFactory">   
  ref bean=" sessionFactoryA "/>   
property>   
bean>   
   
bean id="testADao" class="org.springframework.aop.framework.ProxyFactoryBean">   
property name="proxyInterfaces">   
  value>org.testA.hibernate.dao.ITestADAOvalue>   
property>   
property name="interceptorNames">   
  list>   
    value> testADaoTarget value>   
  list>   
property>   
bean>   
   
bean id="testBDaoTarget" class="org.testa.hibernate.dao.impl.TestBDAO">   
property name="sessionFactory">   
  ref bean=" sessionFactoryB "/>   
property>   
bean>   
   
bean id="testBDao" class="org.springframework.aop.framework.ProxyFactoryBean">   
property name="proxyInterfaces">   
  value>org.testA.hibernate.dao.ITestBDAOvalue>   
property>   
property name="interceptorNames">   
  list>   
    value> testBDaoTarget value>   
  list>   
property>   
bean>  
四、注意事项
       1、spring已经整合了jotm,如果你使用spring自带的jotm,可能会提示某些类找不到,下载一个最新的jotm包,把lib目录里的所有jar包拷贝到lib目录。
      2、如果系统中使用jndi,则原有的jndi服务可能会无效,提示NameNotFoundException异常,此时在src目录下添加一个carol.properties的属性文件,添加如下内容:
xml 代码

# do not use CAROL JNDI wrapper   
carol.start.jndi=false   
   
# do not start a name server   
carol.start.ns=false   
   
# Naming Factory   
carol.jndi.java.naming.factory.url.pkgs=org.apache.naming  

觉得这个地方有点问题啊


org.testA.hibernate.dao.ITestADAO



testADaoTarget  



里面应该是截取器列表,testADaoTarget应放在target属性吧

这里的dao只是个代理而已,如你所说,它的执行者最后是testADaoTarget
我的想法是,既然是分布式事务,不应该在dao层进行事务拦截,而应该提升到service层。
上面我把service层省略了,比如我这么写:
Java代码

  • "myTransactionManager"   
  •     class="org.springframework.transaction.jta.JtaTransactionManager">   
  •     "userTransaction">   
  •         "jotm" />   
  •       
  •          
                   
                           
                   
           

    Java代码

  • "transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">   
  •   "transactionManager">   
  •   "myTransactionManager"/>   
  •      
  •    
  •          
              
              
              
           
    然后你在自己的service层的拦截器列表中添加这个transactionInterceptor拦截器就可以了,由它里边的jtom管理事务。
    如:
  •     "testManagerTarget" class="org.test.spring.service.impl.testServiceImpl">      
  • "testADao">   
  •   "testADao"/>   
  •       
  • "testBDao">   
  •   "testBDao"/>   
  •    
  •                    
           
              
                     
           
              
           
           
  • "testService" class="org.springframework.aop.framework.ProxyFactoryBean">   
  •    "proxyInterfaces">   
  •    org.test.spring.service.ItestService   
  •       
  •    "interceptorNames">   
  •          
  •          "transactionInterceptor"/>           
  •          
  •       
  •   


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/52454/showart_687369.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP