`
小天蝎
  • 浏览: 143540 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

spring+hibernate+jotm分布式事务配置总结

阅读更多
在前段开发的系统中,使用到了两个不同网域的oracle数据库,需要处理之间的事务,于是选择了spring+hibernate+jotm组合,现粘贴我的配置,看看大家有什么更优的配置或写法,谢谢。

一、环境及框架
       Tomcat+spring+hibernate+jotm,还有就是struts、Oracle等
二、需求说明
      系统里有2套不同网域的oracle数据库,之间的数据需要进行交互。
三、Dao配置
       1、定义jtom Bean  
xml 代码
 
  1. <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />  

       2、定义数据源
xml 代码
 
  1. <bean id="dataSourceA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">  
  2.     <property name="dataSource">  
  3.         <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">  
  4.             <property name="transactionManager">  
  5.                 <ref local="jotm" />  
  6.             </property>  
  7.             <property name="driverName">  
  8.                 <value>oracle.jdbc.driver.OracleDriver</value>  
  9.             </property>  
  10.             <property name="url">  
  11.                 <value>jdbc:oracle:thin:@192.168.0.10:1521:A</value>  
  12.             </property>  
  13.         </bean>  
  14.     </property>  
  15.     <property name="user">  
  16.         <value></value>  
  17.     </property>  
  18.     <property name="password">  
  19.         <value> </value>  
  20.     </property>  
  21. </bean>   
  22.   
  23.   
  24. <bean id="dataSourceB" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown">  
  25.     <property name="dataSource">  
  26.         <bean class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown">  
  27.             <property name="transactionManager">  
  28.                 <ref local="jotm" />  
  29.             </property>  
  30.             <property name="driverName">  
  31.                 <value>oracle.jdbc.driver.OracleDriver</value>  
  32.             </property>  
  33.             <property name="url">  
  34.                 <value>jdbc:oracle:thin:@192.168.0.10:1521:B</value>  
  35.             </property>  
  36.         </bean>  
  37.     </property>  
  38.     <property name="user">  
  39.         <value> </value>  
  40.     </property>  
  41.     <property name="password">  
  42.         <value> </value>  
  43.     </property>  
  44. </bean>   

       3、定义sessionFactory
xml 代码
 
  1. <bean id="sessionFactoryA" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  2.     <property name="dataSource">  
  3.         <ref local="dataSourceA" />  
  4.     </property>  
  5.     <property name="mappingDirectoryLocations">  
  6.         <list>  
  7.             <value>classpath:/org/testa/hibernate/model/</value>  
  8.         </list>  
  9.     </property>  
  10.     <property name="hibernateProperties">  
  11.         <props>  
  12.             <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>  
  13.             <prop key="hibernate.show_sql">true</prop>  
  14.             <prop key="hibernate.jdbc.batch_size">50</prop>  
  15.             <prop key="hibernate.cache.use_query_cache">true</prop>  
  16.             <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>  
  17.         </props>  
  18.     </property>  
  19.     <property name="jtaTransactionManager">  
  20.         <ref bean="jotm" />  
  21.     </property>  
  22.     <property name="lobHandler" ref="lobHandler"/>  
  23. </bean>       
  24.           
  25. <bean id="sessionFactoryB" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  26.     <property name="dataSource">  
  27.         <ref local="dataSourceB" />  
  28.     </property>  
  29.     <property name="mappingDirectoryLocations">  
  30.         <list>  
  31.             <value>classpath:/org/testb/hibernate/model/</value>  
  32.         </list>  
  33.     </property>  
  34.     <property name="hibernateProperties">  
  35.         <props>  
  36.             <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>  
  37.             <prop key="hibernate.show_sql">true</prop>  
  38.             <prop key="hibernate.jdbc.batch_size">50</prop>  
  39.             <prop key="hibernate.cache.use_query_cache">true</prop>  
  40.             <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>  
  41.         </props>  
  42.     </property>  
  43.     <property name="jtaTransactionManager">  
  44.         <ref bean="jotm" />  
  45.     </property>  
  46.     <property name="lobHandler" ref="lobHandler"/>  
  47. </bean>  
       4、事务管理配置
xml 代码
 
  1. <bean id="myTransactionManager"  
  2.     class="org.springframework.transaction.jta.JtaTransactionManager">  
  3.     <property name="userTransaction">  
  4.         <ref local="jotm" />  
  5.     </property>  
  6. </bean>  

       5、dao的配置
xml 代码
 
  1. <bean id="testADaoTarget" class="org.testa.hibernate.dao.impl.TestADAO">  
  2. <property name="sessionFactory">  
  3.   <ref bean=" sessionFactoryA "/>  
  4. </property>  
  5. </bean>  
  6.   
  7. <bean id="testADao" class="org.springframework.aop.framework.ProxyFactoryBean">  
  8. <property name="proxyInterfaces">  
  9.   <value>org.testA.hibernate.dao.ITestADAO</value>  
  10. </property>  
  11. <property name="interceptorNames">  
  12.   <list>  
  13.     <value> testADaoTarget </value>  
  14.   </list>  
  15. </property>  
  16. </bean>  
  17.   
  18. <bean id="testBDaoTarget" class="org.testa.hibernate.dao.impl.TestBDAO">  
  19. <property name="sessionFactory">  
  20.   <ref bean=" sessionFactoryB "/>  
  21. </property>  
  22. </bean>  
  23.   
  24. <bean id="testBDao" class="org.springframework.aop.framework.ProxyFactoryBean">  
  25. <property name="proxyInterfaces">  
  26.   <value>org.testA.hibernate.dao.ITestBDAO</value>  
  27. </property>  
  28. <property name="interceptorNames">  
  29.   <list>  
  30.     <value> testBDaoTarget </value>  
  31.   </list>  
  32. </property>  
  33. </bean>  


四、注意事项
       1、spring已经整合了jotm,如果你使用spring自带的jotm,可能会提示某些类找不到,下载一个最新的jotm包,把lib目录里的所有jar包拷贝到lib目录。

      2、如果系统中使用jndi,则原有的jndi服务可能会无效,提示NameNotFoundException异常,此时在src目录下添加一个carol.properties的属性文件,添加如下内容:
xml 代码
 
  1. # do not use CAROL JNDI wrapper  
  2. carol.start.jndi=false  
  3.   
  4. # do not start a name server  
  5. carol.start.ns=false  
  6.   
  7. # Naming Factory  
  8. carol.jndi.java.naming.factory.url.pkgs=org.apache.naming  
分享到:
评论
3 楼 superkid 2007-10-19  
我在用jotm的时候,由于插入的表和数据比较大,插入动作没有做完,事务就已经提交了,恳请能得到你的帮助.
我的msn:zlc702@hotmail.com
2 楼 小天蝎 2007-06-11  
charka 写道
觉得这个地方有点问题啊

<bean id="testADao" class="org.springframework.aop.framework.ProxyFactoryBean">  
<property name="proxyInterfaces">  
  <value>org.testA.hibernate.dao.ITestADAO</value>  
</property>  
<property name="interceptorNames">  
  <list>  
    <value> testADaoTarget </value>  
  </list>  
</property>  
</bean>

<property name="interceptorNames">里面应该是截取器列表,testADaoTarget应放在target属性吧。



这里的dao只是个代理而已,如你所说,它的执行者最后是testADaoTarget
我的想法是,既然是分布式事务,不应该在dao层进行事务拦截,而应该提升到service层。

上面我把service层省略了,比如我这么写:
	<bean id="myTransactionManager"
		class="org.springframework.transaction.jta.JtaTransactionManager">
		<property name="userTransaction">
			<ref local="jotm" />
		</property>
	</bean>


	<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
	  <property name="transactionManager">
	  <ref bean="myTransactionManager"/>
	  </property>

	</bean>


然后你在自己的service层的拦截器列表中添加这个transactionInterceptor拦截器就可以了,由它里边的jtom管理事务。
如:
  	<bean id="testManagerTarget" class="org.test.spring.service.impl.testServiceImpl">	
	<property name="testADao">
	  <ref bean="testADao"/>
	</property>  	
	<property name="testBDao">
	  <ref bean="testBDao"/>
	</property>
	</bean>


  <bean id="testService" class="org.springframework.aop.framework.ProxyFactoryBean">
     <property name="proxyInterfaces">
     <value>org.test.spring.service.ItestService</value>
     </property>
     <property name="interceptorNames">
        <list>
           <idref bean="transactionInterceptor"/>        
        </list>
     </property>
  </bean>
1 楼 charka 2007-06-10  
觉得这个地方有点问题啊

<bean id="testADao" class="org.springframework.aop.framework.ProxyFactoryBean">  
<property name="proxyInterfaces">  
  <value>org.testA.hibernate.dao.ITestADAO</value>  
</property>  
<property name="interceptorNames">  
  <list>  
    <value> testADaoTarget </value>  
  </list>  
</property>  
</bean>

<property name="interceptorNames">里面应该是截取器列表,testADaoTarget应放在target属性吧。

相关推荐

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

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

    struts + spring + hibernate + velocity + ajax + jotm + acegi

    Struts、Spring、Hibernate、Velocity、Ajax、JOTM 和 Acegi 是一组常见的技术栈,它们在构建企业级Java Web应用程序时发挥着关键作用。这些技术各有专长,结合使用可以构建出高效、灵活且安全的系统。接下来,我们...

    spring+hibernate+jtom demo

    在本文中,我们将深入探讨如何使用Spring、Hibernate和JOTM进行分布式事务管理,以实现在一个Service方法中同时操作两个不同数据源的数据,并确保任何错误都能导致所有操作回滚。首先,我们需要了解这些技术的基本...

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

    总结来说,Spring结合JOTM和Hibernate进行多数据源事务管理,主要涉及以下几个步骤:配置JOTM依赖,定义XADataSource,创建并配置AtomikosTransactionManager,设定事务策略,以及正确地集成Hibernate ...

    spring-hibernate-jotm 例子

    为了运行这个示例,你需要将这些jar包添加到你的项目类路径中,然后配置Spring的事务管理器为JOTM,并配置Hibernate的相关设置。在Spring的配置文件中,你需要定义一个PlatformTransactionManager bean,通常是...

    Spring多数据源配置_分布式数据

    该系统的架构主要包括:Tomcat作为应用服务器,Spring用于业务逻辑层的控制,Hibernate作为ORM(对象关系映射)框架,JOTM(Java Open Transaction Manager)提供事务管理功能,Struts作为MVC(Model-View-...

    java之hibernate和spring技术难点及其要点总结

    3. **分布式事务(jotm)**:当涉及到多个服务或数据库时,分布式事务成为必需,Spring支持与JOTM集成来实现这一目标。 4. **适配器模式与代理模式**:这两种设计模式在Spring中被广泛应用于实现AOP等功能。 5. **...

    跨多个数据库操作,同时连接两个一上的数据库,用事物关联起来

    JTA是Java平台上的标准,用于管理分布式事务,它允许"同时连接两个或以上的数据库"。 JTA提供了统一的API,使得开发者可以在不同的事务资源(如数据库、消息队列等)之间进行协调。在Java环境中,Spring框架是实现...

    spring对多个数据库进行事务管理.doc

    对于多个数据库的事务管理,Spring主要依赖于JTA(Java Transaction API)和XAResource接口来实现分布式事务。然而,JTA的XA事务通常在J2EE环境下工作,需要容器支持,比如JBoss、WebLogic等。在J2SE环境中,Spring...

    跨多个数据库操作,同时连接多个的数据库,同时操作

    这通常涉及到跨数据库操作和分布式事务处理,确保数据的一致性和完整性。以下是一些关于这个主题的重要知识点: 1. **JTA(Java Transaction API)**:JTA是Java平台中用于处理分布式事务的标准API。它允许应用程序...

    JBPM5入门学习.doc

    - **4.3.4 使用jotm配置tomcat数据源以支持JTA**: 通过Jotm配置Tomcat的数据源,以支持分布式事务。 - **4.3.5 Jbpm相关配置文件更新**: 更新JBPM相关的配置文件,如persistence.xml、jbpm.cfg.xml等。 - **4.3.6 ...

    简易搭建ssh 框架

    - **jotm.jar**:这是一个开源的JTA(Java Transaction API)实现,用于处理分布式事务。 - **ezmorph-1.0.4.jar**:这个库可能用于对象转换,帮助在不同数据格式间进行转换。 在搭建SSH框架时,通常需要以下步骤:...

    OpenJWeb1.6Java快速开发平台功能手册090315

    - **3.4 JTA 集成**:集成 JOTM 的 JTA 产品,支持分布式事务处理。 - **3.5 日志拦截器**:采用 AOP 方式实现的日志拦截器,便于跟踪系统的运行情况。 - **3.6 字段校验器**:支持字段级别的数据校验,提高数据的...

    java开源包1

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包11

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包2

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包3

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包6

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

    java开源包5

    Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...

Global site tag (gtag.js) - Google Analytics