webAppRootKey
trac
org.springframework.web.util.Log4jConfigListener
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf8
forceEncoding
true
CharacterEncodingFilter
/*
dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
/WEB-INF/dispatcher.xml
1
dispatcher
*.action
org.springframework.web.context.ContextLoaderListener
dispatcher.xml
UTF-8
applicationContext.xml
配置 parentDataSource 的父bean.再配置多个数据源继承这个父bean,对driverClass,url,username,password,等数据源连接参数进行各自的重写。例如 mySqlDataSource ,在 DataSources bean中注入所有要切换的数据源,并且设置默认的数据源。
DataSourceInstances.java
public class DataSourceInstances{
public static final String MYSQL="MYSQL";
public static final String ORACLE="ORACLE";
}
定义数据源的标识, 和applicationContext.xml中 DataSources 的 targetDataSources 的key对应
DataSourceSwitch.java
public class DataSourceSwitch{
private static final ThreadLocal contextHolder=new ThreadLocal();
public static void setDataSourceType(String dataSourceType){
contextHolder.set(dataSourceType);
}
public static String getDataSourceType(){
return (String) contextHolder.get();
}
public static void clearDataSourceType(){
contextHolder.remove();
}
}
DataSources.java
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DataSources extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return DataSourceSwitch.getDataSourceType();
}
}
配置于applicationContext 中,线程局部变量ThreadLocal contextHolder 保存当前需要的数据源类型,当 DataSourceSwitch.setDataSourceType(DataSourceInstances.XXX) 保存当前需要的数据源类型的时候,DataSources 会从当前线程中查找线程变量的数据源类型,从而决定使用何种数据源
TestAction.java
@Controller
@SuppressWarnings("unused")
public class TestAction {
@Autowired
TestMapper testMapper;
@RequestMapping("/test.action")
public ModelAndView test(
HttpServletRequest request,
HttpServletResponse resp){
ModelAndView model = new ModelAndView("test");
model.addObject("test1", "这是一个测试,获取默认数据连接MYSQL:"+testMapper.test());
DataSourceSwitch.setDataSourceType(DataSourceInstances.ORACLE);
model.addObject("test2", "这是一个测试,获取数据连接ORACLE:"+testMapper.test());
DataSourceSwitch.setDataSourceType(DataSourceInstances.MYSQL);
model.addObject("test3", "这是一个测试,获取数据连接MYSQL:"+testMapper.test());
return model;
}
}
26
顶
9
踩
分享到:
2012-08-08 02:18
浏览 31068
评论
25 楼
teacherzhu
2016-01-13
coolpep 写道
mickeysx 写道
这个是全局的吧?多个用户使用的情况下,一个用户切换了,就把其他用户都给切换了?
试了,确识是全局的。
这个实现非全局的有方法思路么
23 楼
jkfd
2014-06-05
coolpep 写道
mickeysx 写道
这个是全局的吧?多个用户使用的情况下,一个用户切换了,就把其他用户都给切换了?
试了,确识是全局的。
怎么能弄成非全局的,我也遇到了这个问题。
22 楼
coolpep
2014-05-28
mickeysx 写道
这个是全局的吧?多个用户使用的情况下,一个用户切换了,就把其他用户都给切换了?
试了,确识是全局的。
21 楼
mickeysx
2013-06-20
这个是全局的吧?多个用户使用的情况下,一个用户切换了,就把其他用户都给切换了?
20 楼
robert.wei
2012-08-09
英特耐雄奈尔 写道
真心没这么简单.
换数据源难道真就是切换一下datasource这么简单了?
特别是在ibatis这种半ORM中,
想想,假如在oracle里用语法糖写了一句查树型结构的SQL.
切换到其他数据库不支持怎么办?
另外一个明显的例子就是分页SQL了.
_______________________
ibatis 里面肯定要写两套SQL的, 一套支持oracle, 一套支持mysql
19 楼
英特耐雄奈尔
2012-08-09
真心没这么简单.
换数据源难道真就是切换一下datasource这么简单了?
特别是在ibatis这种半ORM中,
想想,假如在oracle里用语法糖写了一句查树型结构的SQL.
切换到其他数据库不支持怎么办?
另外一个明显的例子就是分页SQL了.
18 楼
一个人de我们
2012-08-09
以后会用到,先收着
17 楼
xuershan
2012-08-09
在多线程下测试过没。
16 楼
lianghe0208
2012-08-09
有空没空在这换数据库。。。
bbyyzhang 写道
唔系好人 写道
Leon.Wood 写道
猫不吃的鱼 写道
kanny87929 写道
谁有空没空在这换数据库。。。
无聊。玩玩呗。。那么认真干嘛。。。
这个我还真用着了,我大概要在18个数据源之间切换
实际项目中用到那么多?
如果你做的是项目可能用不到,如果是产品真有可能经常用
自己用不着就别瞎说,实际项目中用到的地方很多。
15 楼
bbyyzhang
2012-08-09
唔系好人 写道
Leon.Wood 写道
猫不吃的鱼 写道
kanny87929 写道
谁有空没空在这换数据库。。。
无聊。玩玩呗。。那么认真干嘛。。。
这个我还真用着了,我大概要在18个数据源之间切换
实际项目中用到那么多?
如果你做的是项目可能用不到,如果是产品真有可能经常用
14 楼
唔系好人
2012-08-09
Leon.Wood 写道
猫不吃的鱼 写道
kanny87929 写道
谁有空没空在这换数据库。。。
无聊。玩玩呗。。那么认真干嘛。。。
这个我还真用着了,我大概要在18个数据源之间切换
实际项目中用到那么多?
13 楼
Leon.Wood
2012-08-09
猫不吃的鱼 写道
kanny87929 写道
谁有空没空在这换数据库。。。
无聊。玩玩呗。。那么认真干嘛。。。
这个我还真用着了,我大概要在18个数据源之间切换
12 楼
小古墓
2012-08-09
正在研究这个、、有时间试试
11 楼
myreligion
2012-08-09
需要多数据库,试试guzz
10 楼
猫不吃的鱼
2012-08-09
kanny87929 写道
谁有空没空在这换数据库。。。
无聊。玩玩呗。。那么认真干嘛。。。
9 楼
kanny87929
2012-08-09
谁有空没空在这换数据库。。。
8 楼
czllfy
2012-08-09
关注一下
7 楼
a250180463
2012-08-08
求源码
6 楼
sheep3600
2012-08-08
多数据源还好,但是分布式事物就比较恶心了。
« 上一页 1 2 下一页 »