Spring+Mybatis 的多源数据库的搭建

最近,应部门业务需求,老大需要在业务中的一部分数据处理后保存到另一个数据库中(原来的项目只是用到了一个mysql数据库,而现在需要用到2个数据库),考虑到老大还有其它的事情要忙,于是老大就把任务交给了我,说真的,这样的需求以前还真没搞过,但老大交代的任务又必须要完成,于是乎,赶紧网上找了下资料,动手开干。。。奋斗
长话短说,先贴下与多源数据库相关的项目目录:

这个是要用到的配置文件,

这个是多源数据库的主要代码 ,代码不多,才四个Java文件

c3p0配置:

接着是spring_datasource的配置:



上面是用自己写的数据源将数据源1和数据源2进行整合,已达到动态切换的目的。


事物管理还是用的Spring的事物管理,但是这里管理的是自己写的动态数据源,而不再只是原先的数据源1或数据源2
下面重点来了:


这个类就是Spring_datesource.xml配置文件中引用到的类,主要是利用了继承  AbstractRoutingDataSource    来实现对多源数据库的管理
代码:

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * 继承AbstractRoutingDataSource,并重写determineCurrentLookupKey方法  用来管理数据源
 * @author crow
 *
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceTypeManager.get();
    }
}

我们来大致看看这个类是如何管理多个数据源的


看源码 大致是用一个Map  targetDataSources
来装载要用到数据源(数据源1,数据源2) 但是会先用defaultTargetDataSource
默认初始化一个数据源(这里对应Spring_datasource.xml中的数据源1)


然后用枚举列出要用到数据源,对应的是spring_datasource.xml中的两个数据源

<entry key="MASTER"value-ref="dataSource1"/>
<entry key="SLAVE"value-ref="dataSource2"/>

然后是如何来进行切换数据源了


代码如下:

public class DataSourceTypeManager {
    private static final ThreadLocal<DataSources> dataSourceTypes = new ThreadLocal<DataSources>(){
        @Override
        protected DataSources initialValue(){
            return DataSources.MASTER;
        }
    };
    
    public static DataSources get(){
        return dataSourceTypes.get();
    }
    
   public static void set(DataSources dataSourceType){
        dataSourceTypes.set(dataSourceType);
    }
    
    public static void reset(){
        dataSourceTypes.set(DataSources.MASTER);
    }
    }

最后是利用了Spring的AOP来进行动态切换数据源了 以达到我们在处理需要将数据存储到另一个数据库时切换数据源



这里是在执行到特定的service层前,将数据源动态切换到数据源2,执行完成后,在进行数据源重置,切换到主数据源,以达到灵活管理的目的,代码中利用
@Order(0) 注解使得下面的切换数据源在事物执行前执行,致使事物也能正常管理数据库,测试了下,在到特定的业务时真的可以将数据存储到数据源2,看来大功告成了,任务完美完成。。。
另外说一下,这里的多源数据库不仅仅只适用多个相同类型的数据源,不同的数据源(如Oracle或者其它),也是可以的,以为只是在执行到Service前切换了下数据源而已
前提是你要在Mapper文件里配置好对应数据源类型的SQL。
通过这次的环境设置,让我对mybatis这块又懂得了很多,收获还是挺大的微笑



由于是本人第一次写博客,难免有疏漏之处,如有错误,还望不吝指正赐教,本博客也参考了如下大牛的文章,在此表示感谢。
http://zhuchengzzcc.iteye.com/blog/1827633http://zhuchengzzcc.iteye.com/blog/1827633

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值