首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mybatis多数据源切换

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录。

多数据源切换基础概念

多数据源切换是指在一个应用中同时使用多个数据库,并且能够根据业务需求灵活地在这些数据库之间进行切换。MyBatis 提供了多种方式来实现多数据源切换,常见的有:

  1. 动态数据源路由:通过编写一个动态数据源路由器,在运行时决定使用哪个数据源。
  2. AbstractRoutingDataSource:Spring 提供的一个抽象类,可以继承它并实现自己的路由逻辑。
  3. AOP 切面:使用面向切面编程(AOP)在方法调用前切换数据源。

相关优势

  • 提高系统灵活性:不同的业务模块可以使用不同的数据库,便于管理和维护。
  • 提升性能:可以将读写操作分离到不同的数据库,实现负载均衡。
  • 增强扩展性:新增数据源时,只需添加配置和少量代码改动。

类型与应用场景

  • 读写分离:主数据库负责写操作,从数据库负责读操作,适用于读多写少的场景。
  • 分库分表:将数据分散到多个数据库或表中,用于处理大数据量和高并发的情况。
  • 多租户系统:每个租户对应一个独立的数据库,保证数据隔离。

示例代码

以下是一个简单的基于 Spring 和 MyBatis 的多数据源切换示例:

1. 配置多数据源

代码语言:txt
复制
@Configuration
public class DataSourceConfig {

    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

2. 创建动态数据源路由

代码语言:txt
复制
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDataSourceKey();
    }
}

3. 数据源上下文持有者

代码语言:txt
复制
public class DynamicDataSourceContextHolder {

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    public static void setDataSourceKey(String key) {
        contextHolder.set(key);
    }

    public static String getDataSourceKey() {
        return contextHolder.get();
    }

    public static void clearDataSourceKey() {
        contextHolder.remove();
    }
}

4. AOP 切面切换数据源

代码语言:txt
复制
@Aspect
@Component
public class DataSourceAspect {

    @Around("@annotation(com.example.annotation.TargetDataSource)")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        TargetDataSource dataSource = method.getAnnotation(TargetDataSource.class);
        if (dataSource != null) {
            DynamicDataSourceContextHolder.setDataSourceKey(dataSource.value());
        }
        try {
            return point.proceed();
        } finally {
            DynamicDataSourceContextHolder.clearDataSourceKey();
        }
    }
}

5. 自定义注解

代码语言:txt
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TargetDataSource {
    String value();
}

可能遇到的问题及解决方法

问题:数据源切换不生效。 原因:可能是 AOP 切面没有正确拦截到方法调用,或者数据源上下文没有正确设置。 解决方法

  • 确保切面类被 Spring 正确管理。
  • 检查注解是否正确使用在目标方法上。
  • 调试切面逻辑,确认数据源上下文是否正确设置和清除。

通过以上步骤,可以实现 MyBatis 的多数据源切换,并根据实际需求灵活应用到不同的场景中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Boot MyBatis 动态数据源切换、多数据源,读写分离

RESTful API 接口,使用 Druid 实现了 DAO 层数据源动态切换和只读数据源负载均衡 dev: 最简单的切面和注解方式实现的动态数据源切换 druid: 通过切面和注解方式实现的使用...Druid 连接池的动态数据源切换 aspect_dao: 通过切面实现的 DAO 层的动态数据源切换 roundrobin: 通过切面使用轮询方式实现的只读数据源负载均衡 hikari:...升级到SpringBoot 2.0, 数据源使用 Hikari 以上分支都是基于 dev 分支修改或扩充而来,基本涵盖了常用的多数据源动态切换的方式,基本的原理都一样,都是通过切面根据不同的条件在执行数据库操作前切换数据源...在使用的过程中基本踩遍了所有动态数据源切换的坑,将常见的一些坑和解决方法写在了 Issues 里面 该项目使用了一个可写数据源和多个只读数据源,为了减少数据库压力,使用轮循的方式选择只读数据源;考虑到在一个...log,说明动态切换数据源是有效的 注意 在该应用中因为使用了 DAO 层的切面切换数据源,所以 @Transactional 注解不能加在类上,只能用于方法;有 @Trasactional注解的方法无法切换数据源

1.9K50
  • spring+mybatis数据源切换【service层以及controller层】

    最近项目需要切换数据源,查询了相关资料后做了一个简单的数据源的切换。...="annotationClass" value="org.springframework.stereotype.Repository"/> 做好了这些工作就可以在dao层进行数据源的切换了...DataSourceContextHolder.setDataSource(DataSourceContextHolder.READ_DATA_SOURCE); 二、利用spring的aop实现在service切换数据源...然而我们需要在service层或者controller层进行切换,而在进入service时已经开启了一个事务,这时候直接切换数据源是无效的,所以要在service前就切换数据源。...三、直接在controller进行切换,继续探索中 因为项目需要切数据源的地方特别多,在service层切换很费时间,所以准备在controller层进行切换,而尝试了下spring的切面在这里直接切不了

    87910

    Spring Boot 构建多租户系统 实现动态切换数据源

    Spring Boot 构建多租户系统 实现动态切换数据源 概述 SaaS(Software as a Service),多租户系统(一套系统,不同租户数据不同) 它只是一种软件架构,从技术角度来说很好实现...3:独立数据库 一个租户一个数据库(采用) 方案3实现 采用方案3需要创建一个单独的数据库存储所有的租户信息,并存储租户的数据库和数据源信息 难点1:不同租户使用的时候如何进行切换数据库?...我采用的是 二级域名+Header设置租户信息 难点2的解决办法 因为 使用的是mybatis-plus框架 官网提供了两个多数据源的框架 多数据源既动态数据源,项目开发逐渐扩大,单个数据源、单一数据源已经无法满足需求项目的支撑需求...; } /** * 动态添加数据源 【注册mybatis动态数据源】 * * @param sysDataSource 添加数据源数据对象 * @param...DynamicDataSourceContextHolder.push("数据源名称");//动态切换数据源 思路:当请求后端接口的时候 通过web拦截器 拦截一下请求头获取租户编码 进行切换 //web

    5K50

    SaaS多租户架构数据源动态切换解决方案

    在构建多租户SaaS平台时,数据库方案的选择直接关系到数据隔离、性能和可扩展性。 在SaaS平台项目中,根据前端不同的域名查询不同的数据库,通常涉及到多租户架构的实现。...实现这一目标的关键技术之一就是动态切换数据库连接。 设计多租户数据模型 在数据库设计阶段,你需要决定数据隔离的级别。通常有以下几种隔离级别: 独立数据库:每个租户拥有一个独立的数据库实例。...数据源配置 在应用程序的配置文件中,定义每个租户的数据源配置,包括数据库URL、用户名和密码 可以使用环境变量或配置中心来动态加载这些配置。...动态数据源切换 根据请求的域名或其他标识符,动态确定使用哪个数据库连接。这通常通过中间件、拦截器或全局函数来实现。 示例:使用PHP实现域名路由中间件 切换数据库比较方便,经常用于多数据库连接的应用需求。

    1.1K11

    Springboot项目使用动态切换数据源实现多租户SaaS方案

    一、前言 工作中遇到了多组户的需求,因为以前并没有接触过,所以多番查找资料,最后总算做出来了,再此做个总结,记录一下以便日后复习也可以帮助用得着的朋友。...实现多租户大体可以分为三种方案: 1、独立数据库,通过动态切换数据源来实现多租户,安全性最高,但成本也高。 2、共享数据库,隔离数据架构,比如使用oracle用多个schema。...本项目因为对数据安全性要求较高,所以选择的第一种独立数据库切换动态数据源的方案。...,通过自己的实现返回lookupKey,根据lookupKey获取对应数据源达到切换动态切换的功能。...配置动态数据源生效、默认主数据源 看下mybatis的配置如下 /** * @Author: guomh * @Date: 2019/11/06 * @Description: mybatis配置

    4.7K40

    【SpringBoot DB 系列】Mybatis基于AbstractRoutingDataSource与AOP实现多数据源切换

    [logo.jpg] 【SpringBoot DB 系列】Mybatis 基于 AbstractRoutingDataSource 与 AOP 实现多数据源切换 前面一篇博文介绍了 Mybatis 多数据源的配置...,简单来讲就是一个数据源一个配置指定,不同数据源的 Mapper 分开指定;本文将介绍另外一种方式,借助AbstractRoutingDataSource来实现动态切换数据源,并通过自定义注解方式 +...多数据源配置 强烈建议没有看上一篇博文的小伙伴,先看一下上篇博文 【DB 系列】Mybatis 多数据源配置与使用 在开始之前,先有必要回顾一下之前 Mybatis 多数据源配置的主要问题在哪里 多加一个数据源...,使用了下面三个知识点 AbstractRoutingDataSource实现动态数据源切换 自定义@DS注解 + AOP 指定 Mapper 对应的数据源 ConfigurationProperties...项目 相关博文 【DB 系列】Mybatis 多数据源配置与使用 【DB 系列】JdbcTemplate 之多数据源配置与使用 【DB 系列】Mybatis-Plus 代码自动生成 【DB 系列】MybatisPlus

    85700

    【SpringBoot DB 系列】Mybatis 基于 AbstractRoutingDataSource 与 AOP 实现多数据源切换

    【SpringBoot DB 系列】Mybatis 基于 AbstractRoutingDataSource 与 AOP 实现多数据源切换 前面一篇博文介绍了 Mybatis 多数据源的配置,简单来讲就是一个数据源一个配置指定...,不同数据源的 Mapper 分开指定;本文将介绍另外一种方式,借助AbstractRoutingDataSource来实现动态切换数据源,并通过自定义注解方式 + AOP 来实现数据源的指定 数据源配置 强烈建议没有看上一篇博文的小伙伴,先看一下上篇博文 【DB 系列】Mybatis 多数据源配置与使用 在开始之前,先有必要回顾一下之前 Mybatis 多数据源配置的主要问题在哪里...多加一个数据源,需要多一份配置 Mapper 文件需要分包处理,对开发人员而言这是个潜在的坑 针对上面这个,那我们想实现的目的也很清晰了,解决上面两个问题 1....6.小结 本文主要给出了一种基于AbstractRoutingDataSource + AOP实现动态数据源切换的实现方式,使用了下面三个知识点 AbstractRoutingDataSource实现动态数据源切换

    82310

    SpringBoot系列-- Mybatis配合AOP和注解实现动态数据源切换配置

    而在Springboot +Mybatis实现多数据源配置中,我们实现了静态多数据源的配置,但是这种方式怎么说呢,在实际的使用中不够灵活,为了解决这个问题,我们可以使用上文提到的第二种方法,即使用AOP...面向切面编程的方式配合我们的自定义注解来实现在不同数据源之间动态切换的目的。...return bean.getObject(); } } 而在这所有的配置中,最核心的地方就是DynamicDataSource这个类了,DynamicDataSource是我们自定义的动态切换数据源的类...同时AbstractRoutingDataSource类提供了程序运行时动态切换数据源的方法,在dao类或方法上标注需要访问数据源的关键字,路由到指定数据源,获取连接。...如果value的值并没有在我们DataBaseType里面,则使用我们默认的数据源,如果有的话,则切换为相应的数据源。

    1K10

    SSM动态切换数据源

    那么猜测:1、可以往sqlSessionFactory里注入多数据源来实现切换;2、将多个数据源封装成一个总源,再把这个总源注入到sqlSessionFactory里实现切换。...Spring提供了动态切换数据源的功能,那么我们来看看其实现原理 2....因此我们可以将AbstractRoutingDataSource的实现类注入到sqlSessionFactory中来实现切换数据源 二、 刚才我们将多个数据源封装成总源的想法在AbstractRoutingDataSource...property> 因为dynamicDataSource是继承AbstractRoutingDataSource,所以setter注入方法得去父类里面去找,开始笔者也是懵了一下 3.3 切换数据源...数据源是在Service层切换的 UserService @Service public class UserService { @Autowired private UserDao

    1.1K40

    SpringBoot动态切换多数据源

    SpringBoot动态切换多数据源 多数据源 最常见的单一应用中最多涉及到一个数据库,即是一个数据源(Datasource)。...因此Mybatis只需要配置这个动态数据源即可。 什么是动态数据源?...数据源切换如何保证线程隔离? 数据源属于一个公共的资源,在多线程的情况下如何保证线程隔离呢?不能我这边切换了影响其他线程的执行。...//执行afterPropertiesSet方法,完成属性的设置 super.afterPropertiesSet(); } } 上述代码很简单,分析如下: 一个多参的构造方法...定义一个注解 为了操作方便且低耦合,不能每次需要切换的数据源的时候都要手动调一下接口吧,可以定义一个切换数据源的注解,如下: /** * 切换数据源的注解 */ @Target(value = ElementType.METHOD

    1.6K70

    Mybatis数据源结构解析

    本文将通过对 MyBatis 框架的数据源结构进行详尽的分析,找出什么时候创建 Connection ,并且深入解析 MyBatis 的连接池。...---- 本章的组织结构: 零、什么是连接池和线程池 一、MyBatis 数据源 DataSource 分类 二、数据源 DataSource 的创建过程 三、 DataSource 什么时候创建 Connection...数据源的分类 在Mybatis体系中,分为3种DataSource ❝打开Mybatis源码找到datasource包,可以看到3个子package ❞ ?...❝MyBatis内部分别定义了实现了java.sql.DataSource接口的UnpooledDataSource,PooledDataSource类来表示UNPOOLED、POOLED类型的数据源。...❝JNDI类型的数据源DataSource,则是通过JNDI上下文中取值。 ❞ 数据源 DataSource 的创建过程 ❝在mybatis的XML配置文件中,使用元素来配置数据源: ❞ <!

    42510

    Spring项目中使用两种方法动态切换数据源,多数据源切换

    14 次查看 本文介绍两种动态切换数据库的方法。 方法一:数据源信息配置在xml中,适用于一般数据库切换。执行完某操作,切换数据库,执行另一个操作。...方法二:数据源信息配置在默认数据源中,适用于切换数据库操作同一方法,相当于批量执行方法。 两种方法核心都是AbstractRoutingDataSource,由spring提供,用来动态切换数据源。...defaultTargetDataSource默认目标数据源,targetDataSources(map类型)存放用来切换的数据源。...配置完以后,其他地方用到数据源的话,都引用multiDataSource。 3…手动切换数据源,切换完以后,记得再切回默认数据库。...1 2 3 4… 利用aop切换数据源,这里记得开启aop,配置文件中使用 4.1首先定义一个注解,来调用注解切换数据库 import java.lang.annotation.Documented

    2.3K20
    领券