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

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

阅读更多
上篇 Hibernate+Spring多数据库解决方案(一)

4) 事务控制,使用Spring的 JtaTransactionManager 类来控制,但要为其注入JBboss启动后的 JTA事务管理器的名字 java:comp/UserTransaction; 使用Spring的自动代理功能为 业务类 *Service 进行拦截,控制事务边界。
    
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">  
    <property name="userTransactionName" value="java:comp/UserTransaction"/>  
    </bean>   
      
    <bean id="transactionAdvisor" class="org.springframework.transaction.interceptor.TransactionInterceptor">  
    <property name="transactionManager" >  
    <ref local="transactionManager"/>  
    </property>  
    <property name="transactionAttributes">  
   <props>   
   <prop key="*">PROPAGATION_REQUIRED</prop>   
   </props>  
   </property>  
   </bean>   
     
   <!-- 注册自动代理创建,为业务Bean添加事务拦截器 -->   
   <bean id="BOAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
   <property name="proxyTargetClass" value="true"></property>  
   <property name="beanNames">  
   <list>  
   <value>*Service</value>   
   </list>  
   </property>  
   <property name="interceptorNames">  
   <list>   
   <value>trasactionMethodPointcutAdvisor</value> <!-- 注意: 事务拦截器必须包含在业务日志拦截器中,以免事务控制混乱;或者将业务日志的方法recordLog 设置为 PROPAGATION_REQUIRES_NEW 属性 -->   
   </list>  
   </property>  
   </bean>  

 <


   5) 配置 XA 数据源,在 jboss 4 的 server/default/deploy  目录下添加 oracle-xa-ds.xml 文件,在其中配置数据源,

 
  <xa-datasource>  
    <jndi-name>XAOracleDS_MAIN</jndi-name>  
    <track-connection-by-tx/>  
    <isSameRM-override-value>false</isSameRM-override-value>  
    <use-java-context>false</use-java-context>   
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>  
    <xa-datasource-property name="URL">jdbc:oracle:thin:@192.168.0.25:1521:DB_SYS</xa-datasource-property>  
    <xa-datasource-property name="User">admin</xa-datasource-property>  
    <xa-datasource-property name="Password">admin</xa-datasource-property>  
   <!-- Uses the pingDatabase method to check a connection is still valid before handing it out from the pool -->  
   <!--valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name-->  
   <!-- Checks the Oracle error codes and messages for fatal errors -->  
   <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>  
   <!-- Oracles XA datasource cannot reuse a connection outside a transaction once enlisted in a global transaction and vice-versa -->  
   <no-tx-separate-pools/>  
   <metadata>  
   <type-mapping>Oracle9i</type-mapping>  
   </metadata>  
   </xa-datasource>  



这里是 XAOracleDS_MAIN 的配置,XAOracleDS_ORDER 的配置修改下 IP,user,password就可以了。

   6) 关键代码
    最关键的一步,就是以往 dao.setSessionFactory( sessionFactory ) 注入,要改为由  SessionFactoryManager 来注入,否则dao无法关联到正确的库,也无法操作数据。

    我们项目中采用动态 Service,DAO 创建,也就是零配置,是在 DAOFactory 中进行的注入,在 DAOFactory.createDAO(daoClass)方法中,源代码贴出来,帮助理解:

 
  public class DAOFactory {   
    /** 
    * 创建DAO类 
    * @param daoClass 
    * @return 
    * @throws Exception 
    */  
    public static BaseDAO createDAO(Class daoClass) throws Exception {  
           SessionFactoryManager sessionFactoryManager = (SessionFactoryManager) BeanFactory.getBean(SessionFactoryManager.class);  
         BaseDAO dao = null;  
         try {  
               dao = (BaseDAO) BeanFactory.createBean(daoClass);  
         } catch (Exception e) {  
            throw e;  
         }  
         SessionFactory sf = sessionFactoryManager.getSessionFactory( dao.getVoClass() );  
         dao.setSessionFactory(sf); //注入sessionFactory  
         return dao;  
      }  
   }  


OK。 写个测试用例跑跑看:在删除user的时候,同时删除它对应的所有订单。 

下篇再详细说下多库的集中模式,和 SessionFactoryManager  的实现原理。

分享到:
评论
4 楼 赵武艺 2012-02-22  
你好!什么时候介绍多数据库的架构模式和路由的处理原理?哪个sessionFactoryManager的实现原理是怎么样的?请教了,谢谢!
3 楼 raymond2006k 2008-09-27  
stxu1987 写道
既然已经在spring配置文件中配置了2个sessionfactory,为什么不直接使用配置文件把需要的sessionfactory直接注入到DAO中?


补充一下(也算提前预告), 不管是两库,还是多库,只要符合“平行库”的多数据库架构,也都可以用配置的方式进行固定注入, 例如:
    <bean id="userDao" class="com.sr.jsfuser.dao.jdbc.UserDao">         
    <property name="sessionFactory" ref="sessionFactory_DB_MAIN" />         
</bean>

但是在“主+分支”的多数据库架构中,例如:一个省公司库+多个市公司库, 数据路由需要由例如 user 的所属的公司的编码 companyID 来决定, 因为此时 Order 在每个市公司库中都有,这种方式就需要使用变量的方式了。
(我们项目中是十多个数据库的架构)。 不过使用 sessionFactoryManager 来处理路由算法 还是更为简便。

过几天会详细介绍多数据库架构的这两种模式和路由的处理原理。
2 楼 raymond2006k 2008-09-27  
stxu1987 写道
既然已经在spring配置文件中配置了2个sessionfactory,为什么不直接使用配置文件把需要的sessionfactory直接注入到DAO中?



如果你的Service ,DAO是一个个配置在Spring中的话,完全可以啊直接注入啊,没问题,只要你不怕麻烦的话,注意不要配叉了。

只是个人不喜欢臃肿的 Service ,DAO 配置,个人喜好。
1 楼 stxu1987 2008-09-27  
既然已经在spring配置文件中配置了2个sessionfactory,为什么不直接使用配置文件把需要的sessionfactory直接注入到DAO中?

相关推荐

    车辆管理系统(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...

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

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

    SpringMVC+Hibernate+Spring+maven框架搭建

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

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

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

    Struts+hibernate+spring整合

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

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

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

    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应用程序。它提供了丰富的动作类、拦截器和结果类型,...

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

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

    Struts2+Hibernate+Spring整合教程

    然而,随着Spring Boot的兴起,现在的趋势更多地转向Spring Boot的单体应用开发,因为Spring Boot集成了这些框架,并提供了开箱即用的解决方案,减少了整合的工作量。但了解SSH整合仍然是理解企业级Java Web开发历史...

Global site tag (gtag.js) - Google Analytics