网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > JSP > 正文
Spring多数据源解决方案
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/11/30
下载{$ArticleTitle}原创论文样式

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

Spring多数据源解决方案

  Figure 1 数据分割及多数据库架构

   通常这种多数据源的逻辑会渗透到业务逻辑中,同时也会给我们使用的数据访问API诸如Hibernate和iBatis等带来不便(需要指定多个SessionFactory或SqlMapClient实例来对应多个DataSource)。

Spring多数据源解决方案

  图片看不清楚?请点击这里查看原图(大图)。

  Figure 2 多数据源的选择逻辑渗透至客户端

   解决方案

Spring多数据源解决方案

  图片看不清楚?请点击这里查看原图(大图)。

  Figure 3 采用Proxy模式来封装数据源选择逻辑

   通过采用Proxy模式我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。

   Client提供选择所需的上下文(因为这是Client所知道的),由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。

   Spring2.x的版本中提供了实现这种方式的基本框架,虚拟的DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数据源的选择逻辑。

   实例:

publicclass DynamicDataSource extends AbstractRoutingDataSource {
      static Logger log = Logger.getLogger("DynamicDataSource");
      @Override
      protected Object determineCurrentLookupKey() {
            String userId=(String)DbContextHolder.getContext();
            Integer dataSourceId=getDataSourceIdByUserId(userId);
            return dataSourceId;
      }
}

   实例中通过UserId来决定数据存放在哪个数据库中。

   配置文件示例:

<bean id="dataSource" class="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" class="org.springFramework.orm.ibatis.SqlMapClientFactoryBean">
                <property name="configLocation" value="classpath:com/bitfone/smartdm/dao/sqlmap/sql-map-config.XML"/>
                <property name="dataSource" ref="dataSource"/>
           </bean>
            <bean id="UserInfoDAO" class="com.bitfone.smartdm.dao.impl.UserInfoDAO">
 
                  <property name="sqlMapClient" ref="sqlMapClient"/>
            </bean>

(责任编辑:admin)

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号