`
raymond2006k
  • 浏览: 293877 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate+Spring多数据库解决方案(一)

阅读更多
我以前在项目中的探索和实践,写出来与大家分享。 大家有其他好的方式,也欢迎分享。

环境:JDK 1.4.x , Hibernate 3.1, Spring 2.0.6, JBOSS4.0, 开发模式: Service + DAO 
  


我们项目中需要同时使用多个数据库. 但 Hibernate 不能直接支持,为此我们对比了网上网友的方案,自己做了一点探索。

1. Demo需求
      我们的项目使用一个全省的公共库加十多个地市库的架构。 本文主要说明原理,将需求简化为两库模型。
      主库:User管里,主要是系统管理,鉴权等数据;
      订单库:Order 管理,存放订单等业务性数据。

2. 原理:
      1) Hibernate 的每个配置文件对应一个数据库,因此多库需要做多个配置文件。本文以两个为例:
        主库 hibernate_sys.cfg.xml,
        订单库 hibernate_order.cfg.xml

        每个库,Hibernate 对应一个 sessionFactory 实例,因此Hibernate下的多库处理,就是在多个 sessionFactory 之间做好路由。

      2) sessionFactory 有个 sessionFactory.getClassMetadata(voClass) 方法,返回值不为空时,表示该 VO 类在该库中
        (hbm.xml文件配置在了对应的hibernate.cfg.xml中), 该方法是数据路由的核心和关键所在。
         因此,  User.hbm.xml 配置在 hibernate_sys.cfg.xml ,
         Order数据位于配置到 hibernate_order.cfg.xml

      3) 多库处理时,需要使用 XA 事务管理。本例中使用 Jboss4.0 来做JTA事务管理;用JOTM,其他应用服务器原理相同。

3.  实现
    1) 为做多 sessionFactory 实例的管理,设计 SessionFactoryManager 类,功能就是做数据路由,
      控制路由的核心是 sessionFactoryMap 属性,它按 dbFlag=sessionFactory 的方式存储了多个库的 引用。

        判断路由要使用的核心方法就是
        public Session getSessionFactory(Class voClass) ,它根据传入的 voClass,返回对应sessionFactory 的 当前 session。

        SessionFactoryManager  类的详细实现原理以后为大家说明。

    2) Hibernate配置

        主库 hibernate_sys.cfg.xml
    <session-factory>  
    <!-- 多数据源使使用,需要在J2EE服务器上配置XA数据源 -->  
    <property name="connection.datasource">XAOracleDS_MAIN</property>  
    <property name="hibernate.session_factory_name">hibernate1</property>  
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>  
    <property name="transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>  
    <property name="jta.UserTransaction">UserTransaction</property>  
      
    <property name="dialect">org.hibernate.dialect.OracleDialect</property>  
   <property name="jdbc.batch_size">5</property>  
   <property name="jdbc.fetch_size">5</property>  
   <property name="max_fetch_depth">1</property>  
     
   <mapping resource="org/bamboo/hibernate/demo/User.hbm.xml" />   
   </session-factory>  


    订单库 hibernate_order.cfg.xml
 
 
 <session-factory>  
    <property name="connection.datasource">XAOracleDS_ORDER</property>  
    <property name="hibernate.session_factory_name">hibernate2</property>  
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>  
    <property name="transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>  
    <property name="jta.UserTransaction">UserTransaction</property>  
      
    <property name="dialect">org.hibernate.dialect.OracleDialect</property>  
    <property name="jdbc.batch_size">5</property>  
   <property name="jdbc.fetch_size">5</property>  
   <property name="max_fetch_depth">1</property>  
     
   <mapping resource="org/bamboo/hibernate/demo/Order.hbm.xml" />   
   </session-factory> 


    3) Spring配置 applicationContext.xml
    使用Spring提供的 org.springframework.orm.hibernate3.LocalSessionFactoryBean 类,为每个库配置一个sessionFactory bean:
   
 <!-- 库1:主库,存储系统管理数据-->  
    <bean id="sessionFactory_DB_MAIN" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
    <property name="configLocations">   
    <list>  
    <value>classpath:hibernate_sys.cfg.xml</value>  
    </list>   
    </property>  
    </bean>  
      
   <!-- 库2:订单库,存储业务数据 -->  
   <bean id="sessionFactory_DB_ORDER" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
   <property name="configLocations">   
   <list>  
   <value>classpath:hibernate_order.cfg.xml</value>  
   </list>   
   </property>  
   </bean>  



配置  SessionFactoryManager 来管理多个 sessionFactory

 
  <bean id="org.bamboo.hibernate.SessionFactoryManager" class="org.bamboo.hibernate.SessionFactoryManager">  
    <property name="sessionFactoryMap" >  
    <props>   
    <prop key="sessionFactory_DB_MAIN"><ref local="sessionFactory_DB_MAIN"/></prop>  
    <prop key="sessionFactory_DB_ORDER"><ref local="sessionFactory_DB_ORDER"/></prop>  
    <!--其他库加在后面-->  
    </props>  
    </property>   
    </bean>  


Hibernate+Spring多数据库解决方案(二)
分享到:
评论

相关推荐

    车辆管理系统(struts+hibernate+spring+oracle).rar

    车辆管理系统是一种基于Web的软件应用,用于有效管理和追踪车辆的相关信息,如车辆状态、维修记录、保养周期、燃油消耗等。...这样的架构设计保证了系统的高效运行和可扩展性,为车辆管理提供了可靠的信息化解决方案。

    JSP源码——车辆管理系统(struts+hibernate+spring+oracle).zip

    Oracle数据库是这个系统的数据存储中心,它提供了高性能、高可靠性的数据存储解决方案。在车辆管理系统中,Oracle数据库可能包含了如车辆信息表、用户信息表、租赁记录表等多个数据表,用于存储和检索系统所需的各种...

    java web 实战宝典_JSP+Servlet+Struts_2+Hibernate+Spring+Ajax

    Struts 2是基于MVC设计模式的Web层框架,Spring是一个全面的轻量级解决方案,提供了企业级开发的支持,包括依赖注入、事务管理、面向切面编程等功能,而Hibernate是一个对象关系映射(ORM)框架,用于简化数据库操作...

    struts + hibernate + spring demo

    Spring框架则是一个全面的后端解决方案,包含了依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问接口(DAO)等众多功能。Spring的IoC容器管理对象的生命周期和依赖关系,使得代码更加可测试和可维护。...

    车辆管理系统(struts+hibernate+spring+oracle)130225.rar

    车辆管理系统是一种基于Java技术开发的综合管理解决方案,用于管理和跟踪各种车辆相关信息,如车辆信息、驾驶员信息、保养记录、行驶里程等。在这个特定的案例中,系统采用了经典的SSH(Struts、Hibernate、Spring)...

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

    "spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目"是针对这种需求的一个解决方案,旨在提供一种灵活且动态的数据源切换机制。 首先,Spring框架作为Java领域中最受欢迎的应用框架之一,其强大...

    JAVA WEB整合开发实例精通:Struts+Hibernate+Spring

    Spring是Java企业级应用开发的全面解决方案,它不仅包含ORM和MVC支持,还提供了依赖注入(DI)、面向切面编程(AOP)、事务管理等核心功能。Spring的IoC容器管理应用的组件,使得组件之间的依赖关系可以外部化,...

    struts2+hibernate+spring整合的管理系统

    这个管理系统就是基于这三个框架的集成,提供了高效、灵活且可维护的解决方案。 Struts2作为MVC(Model-View-Controller)架构的实现,主要负责控制流程,它提供了一种组织应用程序的方式,使得业务逻辑与视图层和...

    javaWeb项目整合开发的各个项目源码包括各种框架(struts+hibernate+spring)

    再者,Spring框架是企业级应用开发的重要支柱,它提供了一个全面的依赖注入(DI)和面向切面编程(AOP)解决方案。在JavaWeb项目中,Spring作为“胶水”框架,可以协调Struts和Hibernate的运作,实现各组件间的解耦...

    博客系统(struts+hibernate+spring).rar

    SSH是Java Web开发中的一个流行组合,它们各自负责应用程序的不同层面,协同工作以提供高效、灵活和可维护的解决方案。 Struts是Apache基金会的开源MVC(Model-View-Controller)框架,它为创建结构化、可扩展的Web...

    SpringMVC+Hibernate+Spring+maven框架搭建

    Spring与Spring MVC和Hibernate结合,可以实现服务层和数据访问层的无缝集成,提供一套完整的解决方案。 在使用Maven进行项目构建时,Maven是Apache软件基金会的一个项目管理工具,它通过定义项目对象模型(POM)来...

    毕业设计struts+hibernate+spring添删改查示例源码

    View-Controller)架构中的控制层,Hibernate则专注于持久化数据到数据库,而Spring作为一个全能框架,不仅提供了依赖注入和面向切面编程,还整合了其他两者,形成了一种强大的企业级应用解决方案。 Struts框架是...

    JavaWeb整合开发实战--基于Struts2+Hibernate+Spring(pdf已分割)

    Spring框架是一个全面的后端开发解决方案,涵盖了依赖注入(DI)、面向切面编程(AOP)、数据访问、事务管理等多个方面。Spring的IoC容器负责管理对象的生命周期和依赖关系,使得代码更加模块化,易于测试和维护。...

    web框架PPT——Struts 2+Hibernate+MyBatis+Spring 网站开发案例课堂 书籍附带PPT课件

    Spring MVC是Spring框架的一部分,作为Web层的解决方案,可以与Struts 2共存,提供另一种MVC实现。 在实际的网站开发中,这四个框架的组合使用可以带来以下优势: 1. 分离关注点:通过Spring的DI和AOP,可以实现...

    struts2+spring+hibernate+easyui管理框架

    这个管理系统利用这些技术的特性,提供了一种高效、稳定且易于维护的解决方案。 **Struts2** 是一个强大的MVC(模型-视图-控制器)框架,用于构建基于Java的Web应用程序。它提供了丰富的动作类、拦截器和结果类型,...

    Struts+hibernate+spring整合

    Spring框架则是一个全面的后端解决方案,它包含了依赖注入(DI)、面向切面编程(AOP)、事务管理等功能。Spring的IOC(Inversion of Control)容器负责管理对象的生命周期和依赖关系,使得组件间的耦合度降低。AOP...

    全套源码-论坛系统(Struts 2+Hibernate+Spring实现)

    这个项目旨在提供一个完整的解决方案,帮助开发者理解和实践如何在实际应用中运用这些技术。 【描述】:这个描述暗示了这是一个完整的开源项目,包含所有源代码,适用于学习或作为基础进行二次开发。Struts 2是MVC...

    Struts2+Hibernate+Spring框架搭建(三)

    Spring框架是另一个关键组件,它提供了全面的企业级应用开发解决方案,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。Spring的DI特性使得组件之间的耦合度降低,而AOP则允许开发者定义横切关注点,如日志、...

    Struts2+Hibernate+Spring整合教程

    此外,Spring还包含大量模块,如Spring JDBC、Spring ORM(集成Hibernate等ORM工具)、Spring MVC(可以替代Struts2作为MVC框架)、Spring Boot等,形成了一站式解决方案。 **SSH整合** SSH整合的主要目的是实现各...

Global site tag (gtag.js) - Google Analytics