();
public void clear() {
local.remove();
}
public String get() {
return local.get();
}
public void restore(JoinPoint join) {
local.set(DEFAULT_SOURCE);
}
public void set(String source) {
local.set(source);
}
}
然后写个继承AbstractRoutingDataSource的类,并注入DataSourceEntry,重写determineCurrentLookupKey模版方法
[java] view plaincopyprint?
01./**
02. * 获取数据源(依赖SPRING框架)
03. *
04. * @author shadow
05. * @create 2013.04.03
06. */
07.public class DynamicDataSource extends AbstractRoutingDataSource {
08.
09. private DataSourceEntry dataSourceEntry;
10.
11. @Override
12. protected Object determineCurrentLookupKey() {
13. return this.dataSourceEntry.get();
14. }
15.
16. @Resource
17. public void setDataSourceEntry(DataSourceEntry dataSourceEntry) {
18. this.dataSourceEntry = dataSourceEntry;
19. }
20.
21.}
/**
* 获取数据源(依赖SPRING框架)
*
* @author shadow
* @create 2013.04.03
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
private DataSourceEntry dataSourceEntry;
@Override
protected Object determineCurrentLookupKey() {
return this.dataSourceEntry.get();
}
@Resource
public void setDataSourceEntry(DataSourceEntry dataSourceEntry) {
this.dataSourceEntry = dataSourceEntry;
}
}
最后就是配置下xml文件,以后只需要直接管理dynamicDataSource这个接口就可以了,至于他内部是哪个数据源是不需要关注,写的切面还原是为了保证每次调用完另外的数据源
都会还原成默认数据源,防止有的人忘记设置回默认的,导致其他代码出问题
[java] view plaincopyprint?
01.
02.
04.
05.
06.
07.
08.
10.
11. classpath:properties/jdbc.properties
12.
13.
14.
15.
16.
18.
19.
20.
24.
25.
26.
27.
28.
29.
31.
32. false
33.
34.
35. ${JNDI.template}
36.
37.
38.
39.
40.
42.
43. false
44.
45.
46. ${JNDI.test}
47.
48.
49.
50.
51.
53.
54.
55.
56.
58.
60.
61.
classpath:properties/jdbc.properties
false
${JNDI.template}
false
${JNDI.test}
至于程序里如何变换数据源,你可以在切面上检测哪些方法加入before方法,或者在程序里直接使用DataSourceEntry调用set方法,具体的怎么用不作代码说明了Spring动态切换多数据源解决方案
原文:http://www.cnblogs.com/zengda/p/4500684.html