Java之——SpringMVC+MyBitis+多数据源切换

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48163279

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

/**
 * 定义数据源的标识, 和applicationContext.xml中 DataSources 的 targetDataSources 的key对应
 * @author liuyazhuang
 */
public class DataSourceInstances{
	public static final String MYSQL="MYSQL";
	public static final String ORACLE="ORACLE";
}	

DataSourceSwitch.java

/**
 *
 * @author liuyazhuang
 */
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;
/**
 *配置于applicationContext 中,线程局部变量ThreadLocal contextHolder 保存当前需要的数据源类型,当 DataSourceSwitch. setDataSourceType(DataSourceInstances.XXX) 保存当前需要的数据源类型的时候,DataSources 会从当前线程中查找线程变量的数据源类型,从而决定使用何种数据源

 * @author liuyazhuang
 */
public class DataSources extends AbstractRoutingDataSource{
	@Override
	protected Object determineCurrentLookupKey() {
		return DataSourceSwitch.getDataSourceType();
	}
}

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;
	}
}

你可能感兴趣的:(J2EE企业级开发,JAVA,Java,J2EE)