`

Spring和hibernate多个数据源的事务管理

阅读更多
1、准备工作

我的项目是struts2+spring+hibernate架构,web服务用tomcat;

现在遇到的问题是要连接多个数据库一个Oracle一个SqlServer,现在把我配置过程分享给大家!

使用jta事务,用tomcat+jotm提供事务管理器

请先下载相应的jotm的jar包,放到工程中的lib包中

2、配置hibernate配置文件,有几个数据库就配几个这样的文件

    我的配sqlserver数据库的文件如下:

例如:hibernate_sqlserver.cfg.xml
<hibernate-configuration>
    <session-factory>
        <property name="connection.username">sa</property>
        <property name="connection.url">jdbc:microsoft:sqlserver://192.168.0.100:1433;DatabaseName=PrisonSoftWeb1
</property>
        <property name="dialect">org.hibernate.dialect.SQLServerDialect
</property>
        <property name="myeclipse.connection.profile">test</property>
        <property name="connection.password">server</property>
    <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver
</property>
</session-factory>
<hibernate-configuration>
其他数据库和其类似!

3、配置sping::applicationContext.xml中添加相应的session工厂

(1)以下两个bean用于spring对jotm初始化
  <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
         <property name="userTransaction"><ref local="jotm"/></property>
</bean>
如果您的程序中要处理blob类型的数据就添加如下信息:
<!-- blob 处理 -->
    <bean id="nativeJdbcExtractor" lazy-init="true"  class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>
    <bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.OracleLobHandler">
              <property name="nativeJdbcExtractor">
                  <ref bean="nativeJdbcExtractor"/>
              </property>
    </bean>


以下信息为开发中依据实际情况,程序员或者设计人员添加的内容:
(2)添加session工厂(session工厂的添加注意,必须有一个工厂的id=“sessionFactory”)
<!-- oracle 数据库sessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="configLocation"
           value="classpath:hibernate.cfg.xml">
       </property>
       <property name="hibernateProperties">
         <props>
          <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
          <prop key="hibernate.current_session_context_class">jta</prop>
          <prop key="hibernate.connection.release_mode">after_statement</prop>
          <prop key="hibernate.show_sql">true</prop>
          <prop key="hibernate.format_sql">true</prop>
         <prop key="hibernate.order_updates">true</prop>
         </props>
       </property>
       <!-- 为处理Blob类型字段的句柄声明 -->
       <property name="lobHandler">
          <ref local="lobHandler"/>
       </property><!--这就是上面声明的句柄-->
       <property name="jtaTransactionManager">
         <ref bean="jotm" />
      </property>
    </bean>


<!-- sqlserver 数据库sessionFactory -->

<bean id="sessionFactoryForSqlServer" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

       <property name="configLocation"
           value="classpath:hibernate_SqlServer.cfg.xml">
       </property>
       <property name="hibernateProperties">
         <props>
      <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
          <prop key="hibernate.show_sql">true</prop>
         </props>
       </property>
       <property name="jtaTransactionManager">
         <ref bean="jotm" />
      </property>
    </bean>
(3)为dao注入对应的session工厂
<bean id="sqlServerbaseDao" class="com.gkzx.dao.BaseDaoImpl">
        <property name="sessionFactory">
           <ref bean="sessionFactoryForSqlServer" />
       </property>  
     </bean>
4、手动提交:Dao实现中采用手动提交和回滚事务的办法,避免数据库因事务不能及时提交而引起死锁现象

     this.getSession().clear();
       Transaction tx = null;
    try{
        tx = this.getSessionFactory().getCurrentSession().beginTransaction();
      
        //这里写你的操作数据库的代码:例如:
         this.getHibernateTemplate().update(objBean);
        tx.commit();
    }catch(RuntimeException e){
        if(tx != null)tx.rollback();
        throw e;
    }finally{
        //this.getSession().close();
    }
分享到:
评论

相关推荐

    Spring+Hibernate多数据源

    当项目涉及到多个数据源时,如业务数据、审计数据分别存储在不同的数据库中,就需要进行多数据源的整合。本示例将探讨如何在Spring和Hibernate环境中实现多数据源的配置与管理。 首先,我们来看标题"Spring+...

    spring+hibernate解决多数据源问题3.pdf

    为了操作多个数据库,需要在Spring配置文件中配置多个数据源,并为每个数据源配置相应的SessionFactory。这时会遇到如何区分和管理不同数据源下的SessionFactory的问题。 知识点四:使用GoF装饰器模式 为了更好的...

    spring boot 2多数据源,里面有hibernate和mybatis的多数据源代码

    2. **配置事务管理器**:由于存在多个数据源,我们需要为每个数据源创建一个PlatformTransactionManager。Spring Boot 2支持自动配置,只需添加对应的`@EnableTransactionManagement`和`@Transactional`注解。 3. *...

    spring集合hibernate多数据切换

    综上所述,"spring集合hibernate多数据切换"这个知识点涉及到Spring框架的IoC容器、AOP、事务管理,以及Hibernate的SessionFactory配置等多个方面。通过理解并实践这些内容,开发者能够构建出更灵活、可扩展的企业级...

    spring3+springmvc+jpa+hibernate多数据源

    "spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...

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

    在Spring框架中,多数据源事务管理是一项关键任务,特别是在大型企业级应用中,往往需要同时操作多个数据库。本篇文章将聚焦于如何结合Spring和JOTM(Java Open Transaction Manager)来实现多数据源的事务管理,...

    spring+hibernate+atomikos多数据源

    在多数据源环境中,Hibernate可以通过SessionFactory配置多个数据源,每个数据源对应一个SessionFactory。 3. **Atomikos**: Atomikos是一个开源的JTA(Java Transaction API)实现,提供分布式事务管理服务。在...

    Spring3.0+Hibernate+Atomikos多数据源分布式事务管理

    在分布式环境中,Atomikos可以帮助协调跨多个数据源的事务,确保ACID(原子性、一致性、隔离性和持久性)属性得以维护。它支持多种持久化存储,如JDBC、JMS等,与Spring的集成也十分便捷。 **多数据源事务管理**: ...

    Spring4+Hibernate4+Atomikos3.3多数据源事务管理

    Atomikos3.3支持分布式事务,能够在多个数据源之间协调事务,确保ACID(原子性、一致性、隔离性和持久性)特性。 在集成Atomikos到Spring和Hibernate的环境中,你需要配置Atomikos的相关属性,如`transactions....

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    1. **配置事务管理器**: 在Spring配置文件中定义`PlatformTransactionManager`,如`HibernateTransactionManager`,与数据源关联。 2. **@Transactional注解**: 在需要事务的方法上添加`@Transactional`注解,声明...

    spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目

    4. **MyBatis配置**:配置多个数据源的SqlSessionFactory,以及Mapper接口和XML映射文件。 5. **业务逻辑代码**:在服务层或DAO层,通过Spring的@Autowired注解或自定义数据源选择器来切换使用不同的数据源。 6. *...

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    对于多数据源,我们需要创建多个数据源配置,例如: ```yaml spring: datasource: primary: url: jdbc:mysql://localhost:3306/main_db username: root password: password driver-class-name: ...

    spring 结合druid和hibernate使用jta配置分布式事务

    在事务管理方面,Spring支持编程式和声明式事务,可以处理单个数据库的本地事务,以及跨多个数据源的分布式事务。 `Druid` 是阿里巴巴开源的一个高性能、可扩展的数据源连接池。它除了提供基础的连接池功能外,还...

    spring mvc+hibernate实现事务管理(配置文件版)

    1. 创建Spring的上下文配置文件,例如`applicationContext.xml`,配置数据源、SessionFactory、事务管理器等。 2. 创建Spring MVC的配置文件,如`servlet-context.xml`,配置DispatcherServlet、视图解析器、模型-...

    第二部分spring+hibernate+jta 分布式事务Demo

    - **配置文件**:`applicationContext.xml`是Spring的配置文件,其中会配置数据源、Hibernate SessionFactory、事务管理器等。这里可能会使用`PlatformTransactionManager`接口的实现,如`JtaTransactionManager`,...

    spring3+hibernate4配置声明式事务管理(annotation方式)

    7. **事务属性**:`@Transactional`注解有多个属性,如`propagation`(事务传播行为)、`isolation`(隔离级别)、`readOnly`(只读事务)、`rollbackFor`和`noRollbackFor`(指定异常类型触发或不触发回滚)。...

    spring和hibernate jar包

    Spring 和 Hibernate 是两个非常重要的Java开发框架,它们在企业级应用开发中占据着核心地位。Spring 是一个全面的后端应用程序框架,而Hibernate 是一个对象关系映射(ORM)工具,用于简化数据库交互。 1. **...

    spring-hibernate3.jar.zip

    这个库可能包含了Spring的IoC容器、Hibernate的实体管理以及两者间的集成配置,使得开发者无需单独导入Spring和Hibernate的多个jar文件,减少了项目的依赖复杂性。 描述中提到的下载经历,反映了在开发过程中寻找...

    Spring与Hibernate整合

    这一步是实现Spring的事务管理功能,确保数据操作的原子性和一致性。 在业务层,可以使用Spring的@Autowired注解来自动注入需要的Service或DAO,这些Service和DAO通常会使用HibernateTemplate进行数据库操作。通过...

    spring3+hibernate4+maven+junit 多库多数据源实现

    在多数据源环境下,可以通过SessionFactory和Session接口配置多个数据源,每个数据源对应一个SessionFactory,以处理不同数据库的连接。 Maven是项目管理工具,它帮助开发者管理项目的构建、依赖和生命周期。在多库...

Global site tag (gtag.js) - Google Analytics