Spring单数据源直接在<bean id="dataSource">下配置数据源的各种连接参数。但动态数据源需要配置个各个数据源例如ds1、ds2等。然后在dataSource中动态根据传递过来的参数动态调用不同的数据源。
1、当进行访问时,首先通过DbContextHolder.setDbType("ds1");设置需要使用的数据源。DbContextHolder就是一个用来存储数据源信息的类,其中通过ThreadLocal来记录数据源信息。
2、DynamicDataSource类集成Spring的AbstractRoutingDataSource类,通过determineCurrentLookupKey方法来获取数据源类型,如果没有对应的数据源则使用defaultTargetDataSource配置。
注意:当设置了数据源之后会一直使用该数据源进行连接,除非使用 DbContextHolder.setDbType重新设置数据源或使用DbContextHolder.clearDbType()清除,清除后使用defaultTargetDataSource进行连接。
1、配置文件
properties
ds1.driverClassName=oracle.jdbc.OracleDriver
ds1.url=jdbc:oracle:thin:@localhost:1521:ORCL
ds1.username=SSM
ds1.password=SSM
ds2.driverClassName=oracle.jdbc.OracleDriver
ds2.url=jdbc:oracle:thin:@10.27.192.43:1522:ORCL
ds2.username=FRAMEWORK_DEV
ds2.password=123456
xml
<bean id="dataSource" class="com.cnpc.framework.db.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="ds1" value-ref="ds1" />
<entry key="ds2" value-ref="ds2" />
</map>
</property>
<property name="defaultTargetDataSource" ref="ds1" />
</bean>
<bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${ds1.driverClassName}" />
<property name="url" value="${ds1.url}" />
<property name="username" value="${ds1.username}" />
<property name="password" value="${ds1.password}" />
</bean>
<bean id="ds2" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${ds2.driverClassName}" />
<property name="url" value="${ds2.url}" />
<property name="username" value="${ds2.username}" />
<property name="password" value="${ds2.password}" />
</bean>
2、Java文件
com.cnpc.framework.db.DynamicDataSource 源码
public class DynamicDataSource extends AbstractRoutingDataSource {
/**
* 取得当前使用那个数据源。
*/
@Override
protected Object determineCurrentLookupKey() {
return DbContextHolder.getDbType();
}
public Logger getParentLogger() {
// TODO Auto-generated method stub
return null;
}
}
DbContextHolder 源码
public class DbContextHolder
{
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
/**
* 设置当前数据库。
* @param dbType
*/
public static void setDbType(String dbType)
{
contextHolder.set(dbType);
}
/**
* 取得当前数据源。
* @return
*/
public static String getDbType()
{
String str = (String) contextHolder.get();
return str;
}
/**
* 清除上下文数据
*/
public static void clearDbType()
{
contextHolder.remove();
}
}
3、测试Code
public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception {
DbContextHolder.setDbType("ds1");
List<DemoSysUser> list1 = demoSysUserService.getAll();
System.out.println(DbContextHolder.getDbType() + ".list.size()=" + list1.size());
DbContextHolder.setDbType("ds2");
List<DemoSysUser> list2 = demoSysUserService.getAll();
System.out.println(DbContextHolder.getDbType() + ".list.size()=" + list2.size());
DbContextHolder.clearDbType();
List<DemoSysUser> list = demoSysUserService.getAll();
ModelAndView mv = this.getAutoView().addObject("sysUserList", list);
return mv;
}
分享到:
相关推荐
springboot+druid+mybatis多数据源动态切换,基于sql类型完成读写分离操作
springboot实现数据源动态切换 注意事项: 1. 该demo采用yml配置数据库信息,注意url标签为jdbc-url 2.项目中加了日志输出,可看到完整执行过程 3.在Service中应用事务时,自定义的注解将失效,解决办法:可将注解...
spring mybatis 多数据源动态切换
Spring-boot+mybatis多数据源整合(动态切换数据源),亲测可用
mybatis+spring实现动态切换数据源,修改数据源配置信息之后,直接运行test可进行测试
spring +springboot+mybatis+maven 读写分离,数据库采用mysql, 采用springboot 采用项目框架搭建,继承spring 中的AbstractRoutingDataSource,实现 determineCurrentLookupKey 进行数据源的动态切换,采用Spring ...
项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源。 此项目就是为了解决这个问题。
Mybatis+Spring+SpringMVC+quartz多数据源切换 定时任务 多数据库之间同步
springboot + mybatis-plus + database+ 多数据源 + redis + hutool 框架干净,没有其他冗余的成分; 配置了MP的代码生成器,意见生成代码,节省开发时间! 可用于各种定时任务处理,各种夸库操作, 多数据源支持...
使用aop进行多数据源切换 springMVC+spring+mybatis增删改查的使用。dk8+tomcat8+mysql+Eclipse+maven。spring+spring mvc+mybatis+bootstrap+jquery
SpringBoot+Druid+MyBatis实现多数据源切换
springboot+mybatis结合,多数据源配置,并实现注解aop动态切换,可实现读写分离,maven结构。
spring整合mybatis多数据源切换 可以运行的demo实例
使用springboot + JPA / MyBatis 实现多数据源动态切换
Spring+SpringMvc+MybatisPlus实现多数据源切换、利用自定义Aop注解,只需要在需要切换数据库的方法上加上注解即可实现、极大避免了代码冗余。
SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询,案例以postgresql和oracle数据库为数据源,分别使用mybatis-plus分页插件和pagehelper分页插件实现分页查询。
springboot + mybatis +mysql+ sqlserver 双数据源 springaop实现自动切换
数据源:druid 用户管理,菜单管理,角色管理,代码生成 运行环境 jdk8+oracle+redis+IntelliJ IDEA+maven 项目技术(必填) Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis 数据库文件 压缩包内 jar包文件 ...
主要介绍了Spring + Mybatis 项目实现动态切换数据源的相关资料,需要的朋友参考下吧
mybatis+spring实现动态切换数据源,修改数据源配置信息之后,直接运行test可进行测试 maven项目 导入即可 jar包都不用 适合学习参考 出自Java自学网 (Java自学网专供 就是免积分下载)