Spring+spring mvc+mybatis 多数据源切换

[复制链接]
查看11 | 回复0 | 2015-8-12 01:43:00 | 显示全部楼层 |阅读模式
spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源。oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换。
web.xml
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
Java代码
@Controller
@SuppressWarnings("unused&quot

public class TestAction {
@Autowired
TestMapper testMapper;

@RequestMapping("/test.action&quot

public ModelAndView test(

HttpServletRequest request,

HttpServletResponse resp){
ModelAndView model = new ModelAndView("test&quot

;
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;
}
}
整理的比较粗略,将代码分享给大家,【源码地址获取】
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行