Hibernate+Spring多数据库解决方案

  • 格式:docx
  • 大小:75.51 KB
  • 文档页数:11

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 Xml代码 1. 2. 3. XAOracleDS_MAIN 4. hibernate1 5. org.hibernate.transaction.JTATransactionFactory 6. org.hibernate.transaction.JBossTransactionManagerLookup 7. UserTransaction 8. 9. org.hibernate.dialect.OracleDialect

10. 5 11. 5 12. 1 13. 14. 15.

[xml] view plaincopy 1. 2. 3. XAOracleDS_MAIN 4. hibernate1 5. org.hibernate.transaction.JTATransactionFactory 6. org.hibernate.transaction.JBossTransactionManagerLookup 7. UserTransaction 8. 9. org.hibernate.dialect.OracleDialect 10. 5 11. 5 12. 1 13. 14. 15. 订单库 hibernate_order.cfg.xml Xml代码 1. 2. 3. XAOracleDS_ORDER 4. hibernate2

5. org.hibernate.transaction.JTATransactionFactory 6. org.hibernate.transaction.JBossTransactionManagerLookup 7. UserTransaction 8. 9. org.hibernate.dialect.OracleDialect

10. 5 11. 5 12. 1 13. 14. 15.

[xml] view plaincopy 1. 2. XAOracleDS_ORDER 3. hibernate2 4. org.hibernate.transaction.JTATransactionFactory 5. org.hibernate.transaction.JBossTransactionManagerLookup 6. UserTransaction 7. 8. org.hibernate.dialect.OracleDialect

9. 5 10. 5 11. 1 12. 13.