`
elvis4139
  • 浏览: 149042 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

基于Spring+Mybatis的多数据源动态切换

阅读更多
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;
    }
分享到:
评论
1 楼 mrathena 2017-11-28  
非常给力, 感谢博主

相关推荐

    springboot+druid+mybatis多数据源动态切换案例

    7. **动态数据源切换**:可以通过定义一个工具类或者Service,提供动态切换数据源的方法,根据业务需求在运行时切换数据源,例如切换到主库执行写操作,切换到从库执行读操作。 8. **测试**:在名为`test`的文件中...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    在多数据源配置中,Spring能够帮助管理不同的数据源,通过配置bean来切换和控制数据源的使用。 **SpringMVC** 是Spring框架的一部分,专为Web开发设计。它简化了模型-视图-控制器(Model-View-Controller,MVC)的...

    Spring+MyBatis多数据源配置实现

    总之,Spring+MyBatis多数据源配置是大型项目中常见的需求,它通过`AbstractRoutingDataSource`实现了动态数据源选择,结合MyBatis的Mapper接口和注解,可以方便地在多个数据库之间切换,从而满足复杂的数据库访问...

    SpringBoot+Mybatis实现数据源动态切换

    springboot实现数据源动态切换 注意事项: 1. 该demo采用yml配置数据库信息,注意url标签为jdbc-url 2.项目中加了日志输出,可看到完整执行过程 3.在Service中应用事务时,自定义的注解将失效,解决办法:可将注解...

    spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目

    "spring+hibernate和spring+myBatis实现连接多个数据库,同时操作的项目"是针对这种需求的一个解决方案,旨在提供一种灵活且动态的数据源切换机制。 首先,Spring框架作为Java领域中最受欢迎的应用框架之一,其强大...

    SpringBoot+gradle+mybatis多数据源动态配置

    综上所述,这个项目通过SpringBoot、Gradle和MyBatis,实现了一个支持多数据源动态切换的应用。开发者可以利用AOP在运行时根据业务逻辑选择合适的数据源,提高了系统的灵活性和可扩展性。同时,Gradle的使用使得依赖...

    Spring+SpringMVC+Mybatis多数据源

    在企业级应用开发中,Spring、...具体实现时,可以根据项目需求选择合适的方式进行数据源切换,以达到优化性能、提高可扩展性的目的。通过合理配置和设计,可以有效地管理和利用多数据源,提升系统的灵活性和可靠性。

    Springboot+Mybatis+Druid多数据源配置

    综上所述,通过Spring Boot、Mybatis和Druid,我们可以灵活地管理多个数据库,实现数据源的动态切换。在实际项目中,这有助于提高系统的灵活性和可扩展性。多数据源配置对于处理分布式系统、读写分离、数据库分片等...

    Spring+Mybatis 多数据源配置

    3. **配置数据源切换**:Spring的`AbstractRoutingDataSource`可以帮助我们实现数据源的动态切换。这个类会根据某种规则(如ThreadLocal、请求参数等)选择当前操作的数据源。 4. **配置Mybatis**:对于每个数据源...

    springboot + mybatis(通用mapper) + HikariCP(比durid更快)多数据源

    `SpringBoot` 的 `AbstractRoutingDataSource` 类可以进一步帮助我们动态切换数据源,根据业务逻辑或事务需求透明地使用不同的数据库。 此外,`MyBatis` 的 `MapperScannerConfigurer` 或 `@MapperScan` 注解可以...

    Spring+SpringMVC+Mybatis动态链接多数据源

    本项目“Spring+SpringMVC+Mybatis动态链接多数据源”旨在实现一个灵活、可扩展的数据源切换机制,以适应复杂的业务场景。 Spring框架作为Java领域中最广泛使用的轻量级框架,它提供了强大的依赖注入和AOP(面向切...

    Springboot+mybatis+druid多数据源配置(oracle+mybatis)

    总结,Spring Boot结合Mybatis和Druid实现多数据源配置的过程包括:配置数据源、配置Mybatis、创建数据源切换器、以及针对不同数据库的测试。这一过程涉及了Spring Boot的自动配置、依赖注入、配置属性绑定等多个...

    spring+mybatis 数据路由源代码

    本项目是基于Spring和Mybatis实现的数据路由功能,它允许应用程序在运行时动态地选择合适的数据源,实现了事务级别的控制,并且不需要依赖于特定的配置中心如Spring Cloud。 首先,我们要理解"多数据源"的概念。多...

    spring+springmvc+mybatis多数据源

    1. 数据源切换的性能:避免在高并发情况下频繁进行数据源切换,以减少性能损耗。 2. 事务一致性:确保跨数据源的事务能够正确提交或回滚,可能需要借助于分布式事务解决方案。 3. 监控和日志:对每个数据源的使用...

    mybatis+spring实现动态切换数据源

    通过以上步骤,我们就实现了MyBatis与Spring配合下的动态数据源切换。这种机制有助于在多租户系统、读写分离或者高可用架构中灵活地管理数据库访问,提高了系统的可扩展性和灵活性。在实际应用中,还需要考虑数据源...

    spring +springboot+mybatis+maven 读写分离及事务管理

    spring +springboot+mybatis+maven 读写分离,数据库采用mysql, 采用springboot 采用项目框架搭建,继承spring 中的AbstractRoutingDataSource,实现 determineCurrentLookupKey 进行数据源的动态切换,采用Spring ...

    springboot+mybatis双数据源配置及事务处理

    Spring Boot通过`@EnableAutoConfiguration`注解自动配置了大量常见服务,包括数据源和MyBatis的配置。然而,当涉及到多个数据源时,我们需要手动进行一些配置。 1. **配置双数据源** - 首先,为每个数据源创建一...

    Spring+MyBatis多数据源配置实现示例

    最后,为了在代码中选择使用哪个数据源,我们可以利用 Spring 的 AOP(面向切面编程)来实现动态数据源切换。创建一个名为 `DynamicDataSource` 的类,实现 `AbstractRoutingDataSource`: ```java @Configuration ...

    springboot + mybatis 多数据源demo

    在现代企业级应用开发中,...通过灵活的配置和智能的路由策略,开发者可以轻松地处理复杂的数据源切换需求,提升系统的健壮性和可扩展性。实践这个示例,将进一步加深对Spring Boot和MyBatis在实际开发中的理解和运用。

Global site tag (gtag.js) - Google Analytics