spring数据源:Spring多数据源解决方案

  在很多大型应用中都会对数据进行切分并且采用多个数据库例子进行管理这样可以有效提高系统水平伸缩性而这样方案就会区别于常见数据例子方案这就要在运行时根据当时请求及系统状态来动态决定将数据存储在哪个数据库例子中以及从哪个数据库提取数据



  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>


Tags:  spbweather数据源 odbc数据源 数据源 spring数据源

延伸阅读

最新评论

发表评论