mysql多数据源切换_spring mvc+mybatis+多数据源切换

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

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

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

求源码

966903dea4bcb507358d5dcce8b912e5.gif

6 楼

sheep3600

2012-08-08

多数据源还好,但是分布式事物就比较恶心了。

« 上一页 1 2 下一页 »

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值