HibernateSpring多数据库解决方案

上传人:阳*** 文档编号:116086426 上传时间:2022-07-04 格式:DOCX 页数:11 大小:42.47KB
收藏 版权申诉 举报 下载
HibernateSpring多数据库解决方案_第1页
第1页 / 共11页
HibernateSpring多数据库解决方案_第2页
第2页 / 共11页
HibernateSpring多数据库解决方案_第3页
第3页 / 共11页
资源描述:

《HibernateSpring多数据库解决方案》由会员分享,可在线阅读,更多相关《HibernateSpring多数据库解决方案(11页珍藏版)》请在装配图网上搜索。

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 的每个配置文件对应一个数据库,

2、因此多库需要做多个配置文件。本文以两个为例: 主库 hibernate_sys.cfg.xml, 订单库 hibernate_order.cfg.xml 每个库,Hibernate 对应一个 sessionFactory 实例,因此Hibernate下的多库处理,就是在多个 sessionFactory 之间做好路由。 2) sessionFactory 有个 sessionFactory.getClassMetadata(voClass) 方法,返回值不为空时,表示该 VO 类在该库中 (hbm.xml文件配置在了对应的hibernate.cfg.xml中), 该方法是数据路由的核心和关键所

3、在。 因此, 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 的方式存储了多个库的 引用。 判断路由要使用的

4、核心方法就是 public Session getSessionFactory(Class voClass) ,它根据传入的 voClass,返回对应sessionFactory 的 当前 session。 SessionFactoryManager 类的详细实现原理以后为大家说明。 2) Hibernate配置 主库 hibernate_sys.cfg.xmlXml代码1. 2. 3. XAOracleDS_MAIN 4. hibernate1 5. org.hibernate.transaction.JTATransactionFactory 6. org.hibernate.transa

5、ction.JBossTransactionManagerLookup 7. UserTransaction 8. 9. org.hibernate.dialect.OracleDialect 10. 5 11. 5 12. 1 13. 14. 15. xmlview plaincopy1. 2. 3. XAOracleDS_MAIN4. hibernate15. org.hibernate.transaction.JTATransactionFactory6. org.hibernate.transaction.JBossTransactionManagerLookup7. UserTran

6、saction8. 9. org.hibernate.dialect.OracleDialect10. 511. 512. 113. 14. 15. 订单库 hibernate_order.cfg.xmlXml代码1. 2. 3. XAOracleDS_ORDER 4. hibernate2 5. org.hibernate.transaction.JTATransactionFactory 6. org.hibernate.transaction.JBossTransactionManagerLookup 7. UserTransaction 8. 9. org.hibernate.dial

7、ect.OracleDialect 10. 5 11. 5 12. 1 13. 14. 15. xmlview plaincopy1. 2. XAOracleDS_ORDER3. hibernate24. org.hibernate.transaction.JTATransactionFactory5. org.hibernate.transaction.JBossTransactionManagerLookup6. UserTransaction7. 8. org.hibernate.dialect.OracleDialect9. 510. 511. 112. 13. 14. 3) Spri

8、ng配置 applicationContext.xml 使用Spring提供的 org.springframework.orm.hibernate3.LocalSessionFactoryBean 类,为每个库配置一个sessionFactory bean:Xml代码1. 2. 3. 4. 5. classpath:hibernate_sys.cfg.xml 6. 7. 8. 9. 10. 11. 12. 13. 14. classpath:hibernate_order.cfg.xml 15. 16. 17. xmlview plaincopy1. 2. 3. 4. 5. classpath

9、:hibernate_sys.cfg.xml6. 7. 8. 9. 10. 11. 12. 13. 14. classpath:hibernate_order.cfg.xml15. 16. 17. 配置 SessionFactoryManager 来管理多个 sessionFactoryXml代码1. 2. 3. 4. 5. 6. 7. 8. 9. 4) 事务控制,使用Spring的 JtaTransactionManager 类来控制,但要为其注入JBboss启动后的 JTA事务管理器的名字 java:comp/UserTransaction; 使用Spring的自动代理功能为 业务类 *S

10、ervice 进行拦截,控制事务边界。Xml代码1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. PROPAGATION_REQUIRED 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. *Service 22. 23. 24. 25. 26. trasactionMethodPointcutAdvisor 27. 28. 29. 30. 31. xmlview plaincopy1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. PROPAGATION_REQUIRED12. 13. 14. 15. 16. 17. 18.

11、 19. 20. 21. *Service22. 23. 24. 25. 26. trasactionMethodPointcutAdvisor27. 28. 29. 30. 31. 5) 配置 XA 数据源,在 jboss 4 的 server/default/deploy 目录下添加 oracle-xa-ds.xml 文件,在其中配置数据源,Xml代码1. 2. XAOracleDS_MAIN 3. 4. false 5. false 6. oracle.jdbc.xa.client.OracleXADataSource 7. jdbc:oracle:thin:192.168.0.25:1

12、521:DB_SYS 8. admin 9. admin 10. 11. org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker 12. 13. org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter 14. 15. 16. 17. Oracle9i 18. 19. xmlview plaincopy1. 2. XAOracleDS_MAIN3. 4. false5. false6. oracle.jdbc.xa.client.OracleXADat

13、aSource7. jdbc:oracle:thin:192.168.0.25:1521:DB_SYS8. admin9. admin10. 11. org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker12. 13. org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter14. 15. 16. 17. Oracle9i18. 19. 这里是 XAOracleDS_MAIN 的配置,XAOracleDS_ORDER 的配置修改下 IP,user,pa

14、ssword就可以了。6) 关键代码 最关键的一步,就是以往 dao.setSessionFactory( sessionFactory ) 注入,要改为由 SessionFactoryManager 来注入,否则dao无法关联到正确的库,也无法操作数据。 我们项目中采用动态 Service,DAO 创建,也就是零配置,是在 DAOFactory 中进行的注入,在 DAOFactory.createDAO(daoClass)方法中,源代码贴出来,帮助理解:Java代码1. publicclassDAOFactory 2. /*3. *创建DAO类4. *paramdaoClass5. *ret

15、urn6. *throwsException7. */ 8. publicstaticBaseDAOcreateDAO(ClassdaoClass)throwsException 9. SessionFactoryManagersessionFactoryManager=(SessionFactoryManager)BeanFactory.getBean(SessionFactoryManager.class); 10. BaseDAOdao=null; 11. try 12. dao=(BaseDAO)BeanFactory.createBean(daoClass); 13. catch(E

16、xceptione) 14. throwe; 15. 16. SessionFactorysf=sessionFactoryManager.getSessionFactory(dao.getVoClass(); 17. dao.setSessionFactory(sf);/注入sessionFactory18. returndao; 19. 20. javaview plaincopy1. publicclassDAOFactory2. /*3. *创建DAO类4. *paramdaoClass5. *return6. *throwsException7. */8. publicstaticB

17、aseDAOcreateDAO(ClassdaoClass)throwsException9. SessionFactoryManagersessionFactoryManager=(SessionFactoryManager)BeanFactory.getBean(SessionFactoryManager.class);10. BaseDAOdao=null;11. try12. dao=(BaseDAO)BeanFactory.createBean(daoClass);13. catch(Exceptione)14. throwe;15. 16. SessionFactorysf=ses

18、sionFactoryManager.getSessionFactory(dao.getVoClass();17. dao.setSessionFactory(sf);/注入sessionFactory18. returndao;19. 20. OK。 写个测试用例跑跑看:在删除user的时候,同时删除它对应的所有订单。下篇再详细说下多库的集中模式,和 SessionFactoryManager 的实现原理。stxu1987 写道既然已经在spring配置文件中配置了2个sessionfactory,为什么不直接使用配置文件把需要的sessionfactory直接注入到DAO中?补充一下(也算

19、提前预告), 不管是两库,还是多库,只要符合“平行库”的多数据库架构,也都可以用配置的方式进行固定注入, 例如:Xml代码1. 2. 3. xmlview plaincopy1. 2. 3. 但是在“主+分支”的多数据库架构中,例如:一个省公司库+多个市公司库, 数据路由需要由例如 user 的所属的公司的编码 companyID 来决定, 因为此时 Order 在每个市公司库中都有,这种方式就需要使用变量的方式了。(我们项目中是十多个数据库的架构)。 不过使用 sessionFactoryManager 来处理路由算法 还是更为简便。过几天会详细介绍多数据库架构的这两种模式和路由的处理原理。既然已经在spring配置文件中配置了2个sessionfactory,为什么不直接使用配置文件把需要的sessionfactory直接注入到DAO中?如果你的Service ,DAO是一个个配置在Spring中的话,完全可以啊直接注入啊,没问题,只要你不怕麻烦的话,注意不要配叉了。只是个人不喜欢臃肿的 Service ,DAO 配置,个人喜好。既然已经在spring配置文件中配置了2个sessionfactory,为什么不直接使用配置文件把需要的sessionfactory直接注入到DAO中?11 / 11文档可自由编辑打印

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!