spring hibernate mysql_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

XAOracleDS_MAIN

hibernate1

org.hibernate.transaction.JTATransactionFactory

org.hibernate.transaction.JBossTransactionManagerLookup

UserTransaction

org.hibernate.dialect.OracleDialect

5

5

1

订单库 hibernate_order.cfg.xml

XAOracleDS_ORDER

hibernate2

org.hibernate.transaction.JTATransactionFactory

org.hibernate.transaction.JBossTransactionManagerLookup

UserTransaction

org.hibernate.dialect.OracleDialect

5

5

1

3) Spring配置 applicationContext.xml

使用Spring提供的 org.springframework.orm.hibernate3.LocalSessionFactoryBean 类,为每个库配置一个sessionFactory bean:

classpath:hibernate_sys.cfg.xml

classpath:hibernate_order.cfg.xml

配置  SessionFactoryManager 来管理多个 sessionFactory

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

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2008-09-26 17:41

浏览 8412

论坛回复 / 浏览 (0 / 1882)

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值