-
Hibernate
+Spring
多数据库解
决方案
我以前在项目中的探索和实践,写出来与大家分享。
大家有其他好的方式,也
欢迎分享。
环境:
JDK
1.4.x
,
Hibernate
3.1,
Spring
2.0.6,
JBOSS4.0,
开发模式
:
Service
+ DAO
我们项目中需要同时使用多个数据库
.
但
Hibernate
不能直接支
持,为此我们
对比了网上网友的方案,自己做了一点探索。
1.
Demo
需求
我们的项目使用一个全省的公共库加十多个地市库的架构。
<
/p>
本文主要说
明原理,将需求简化为两库模型。
主库:
User
管里,主要是系统管理,鉴权等数据;
订单库:
Order
管理,存放订单等业务性数据。
2.
原理:
1
)
Hibernate
的每个配置文件对应一个数据库,
因此多
库需要做多个配
置文件。本文以两个为例:
主库
hibernate_
,
订单库
hibernate_
每个库,
Hibernate
对应一个
sessionFactory
< br>实例,因此
Hibernate
下的多库处理,就是在多
个
sessionFactory
之间做好路由。
2) sessionFactory
有个
ssMetadata(voClass)
方法,返回值不为空时,表示该
VO
类在该库中
(<
/p>
文件配置在了对应的
中
< br>)
,
该方法是数
据路由的核心和关键所在。
因此,
配置在
hibernate_
,
Order
数据位于配置到
hibernate_
3
)
多库处理时,需要使用
XA
事务管理。本例中使用
Jboss4.0
< br>来做
JTA
事务管理;用
JOT
M
,其他应用服务器原理相同。
3.
实现
1
)
为做多
sessionFactory
实例的管理,设计
SessionFactoryManager
类,功能就是做数据路由,
控制路由的核心是
sessionFactoryMap
属性,它按
dbFlag=sessionFactory
的方式存储了多个库的
引用。
判断路由要使用的核心方法就是
public
Session
getSessionFactory(Class
voClass)
,它根据传入的
voClass
,返回对应
sessi
onFactory
的
当前
session
。
SessionFactoryManager
类的详细实现原理以后为大家说明。
2
)
Hibernate
配置
主库
hibernate_
Xml
代码
1.
2.
3.
>
name
=
>
XAOracl
eDS_MAIN
ty>
4.
name
=
>
hiberna
te1
operty>
5.
name
=
>
nsactionFactory
6.
name
=
>
at
ransactionManagerLookup
7.
name
=
>
UserTransaction
8.
9.
name
=
>
Dialect
property>
10.
name
=
>
5
11.
name
=
>
5
12.
name
=
>
1
13.
14.
resource
=
/>
15.
订单库
hibernate_
Xml
代码
1.
2.
3.
name
=
>
XAOracleDS_ORDER
perty>
4.
name
=
>
hibernate2
property>
5.
name
=
>
nsactionFactory
6.
name
=
>
ransactionManagerLookup
7.
name
=
>
UserTra
nsaction
ty>
8.
9.
name
=
>
Dialect
10.
<
/p>
name
=
><
/p>
5
11.
p>
name
=
>
p>
5
12.
p>
name
=
>
p>
1
13.
14.
resource
=
/
>
15.
3) Spring
配置
使用
Spring
提供的
essionFactoryBean
类,为每个
库配置一个
session
Factory bean
:
Xml
代码
1.
11.
id
=
p>
class
=
.e
ssionFactoryBean
>
12.
p>
name
=
>
p>
13.
14.
classpath:hibernate_<
/p>