Figure 1 数据分割及多数据库架构
通常这种多数据源逻辑会渗透到业务逻辑中同时也会给我们使用数据访问API诸如Hibernate和iBatis等带来不便(需要指定多个SessionFactory或SqlMapClient例子来对应多个DataSource)
图片看不清楚?请点击这里查看原图(大图)
Figure 2 多数据源选择逻辑渗透至客户端
解决方案
图片看不清楚?请点击这里查看原图(大图)
Figure 3 采用Proxy模式来封装数据源选择逻辑
通过采用Proxy模式我们在方案中实现个虚拟数据源并且用它来封装数据源选择逻辑这样就可以有效地将数据源选择逻辑从Client中分离出来
Client提供选择所需上下文(这是Client所知道)由虚拟DataSource根据Client提供上下文来实现数据源选择
Spring2.x版本中提供了实现这种方式基本框架虚拟DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数据源选择逻辑
例子:
public DynamicDataSource extends AbstractRoutingDataSource {
Logger log = Logger.getLogger("DynamicDataSource");
@Override
protected Object determineCurrentLookupKey {
String userId=(String)DbContextHolder.getContext;
Integer dataSourceId=getDataSourceIdByUserId(userId);
dataSourceId;
}
}
例子中通过UserId来决定数据存放在哪个数据库中
配置文件举例:
<bean id="dataSource" ="com.bitfone.smartdm.datasource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.Integer">
<entry key="0" value-ref="dataSource0"/>
<entry key="1" value-ref="dataSource1"/>
<entry key="2" value-ref="dataSource2"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource0"/>
</bean>
<bean id="sqlMapClient" ="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="path:com/bitfone/smartdm/dao/sqlmap/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="UserInfoDAO" ="com.bitfone.smartdm.dao.impl.UserInfoDAO">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
最新评论