浏览 1993 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-26
最后修改:2008-11-22
我以前在项目中的探索和实践,写出来与大家分享。 大家有其他好的方式,也欢迎分享。
环境: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多数据库解决方案(二) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |