最近,应部门业务需求,老大需要在业务中的一部分数据处理后保存到另一个数据库中(原来的项目只是用到了一个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来进行动态切换数据源了 以达到我们在处理需要将数据存储到另一个数据库时切换数据源