springboot 动态数据源的实现方法(Mybatis+Druid)

关于Spring Boot动态数据源的实现方法,我将介绍如何使用Mybatis和Druid实现,下面是详细步骤:

1. 引入相关依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.6</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

2. 添加配置文件

spring:
  datasource:
    dynamic:
      ds1: # 数据源1
        url: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
        initial-size: 5
        min-idle: 3
        max-active: 20
        validation-query: SELECT 1
        test-while-idle: true
        time-between-eviction-runs-millis: 60000
      ds2: # 数据源2
        url: jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
        initial-size: 5
        min-idle: 3
        max-active: 20
        validation-query: SELECT 1
        test-while-idle: true
        time-between-eviction-runs-millis: 60000

3. 创建动态数据源

@Configuration
@EnableTransactionManagement
public class DynamicDataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.dynamic")
    public Map<String, DataSource> dataSourceMap() {
        return new LinkedHashMap<>();
    }

    @Bean
    public DataSource dynamicDataSource() {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        Map<String, DataSource> dataSourceMap = dataSourceMap();
        dynamicDataSource.setTargetDataSources(dataSourceMap);
        dynamicDataSource.setDefaultTargetDataSource(dataSourceMap.get("ds1"));
        return dynamicDataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dynamicDataSource());
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dynamicDataSource());
    }
}

4. 创建动态数据源的工具类

public class DataSourceContextHolder {

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

    public static void setDataSourceType(String dataSourceType) {
        CONTEXT_HOLDER.set(dataSourceType);
    }

    public static String getDataSourceType() {
        return CONTEXT_HOLDER.get();
    }

    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }
}

5. 创建数据源切换的AOP拦截器

@Aspect
@Component
public class DataSourceAspect {

    @Pointcut("@annotation(com.example.datasource.annotation.DataSource)")
    public void dataSourcePointcut() {
    }

    @Around("dataSourcePointcut()")
    public Object doAround(ProceedingJoinPoint point) throws Throwable {
        MethodSignature signature = (MethodSignature) point.getSignature();
        DataSource dataSource = signature.getMethod().getAnnotation(DataSource.class);
        if (dataSource != null) {
            DataSourceContextHolder.setDataSourceType(dataSource.value().toString());
        }
        try {
            return point.proceed();
        } finally {
            DataSourceContextHolder.clearDataSourceType();
        }
    }
}

6. 在Service层指定数据源

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @DataSource(DataSourceEnum.DS2)
    public List<User> getUsers() {
        return userMapper.selectUsers();
    }
}

其中,DataSourceEnum为一个自定义的枚举类,用于枚举不同的数据源。

示例1:添加用户数据到数据源1

在测试类中使用@DataSource(DataSourceEnum.DS1)注解指定数据源1,并执行保存用户数据的操作:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    @DataSource(DataSourceEnum.DS1)
    public void testAddUser() {
        User user = new User();
        user.setUsername("test_user1");
        user.setPassword("test_password1");
        userService.addUser(user);
    }
}

示例2:获取用户数据从数据源2

在测试类中使用@DataSource(DataSourceEnum.DS2)注解指定数据源2,并执行获取用户数据的操作:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    @DataSource(DataSourceEnum.DS2)
    public void testGetUsers() {
        List<User> userList = userService.getUsers();
        Assert.assertEquals(1, userList.size());
    }
}

以上就是Spring Boot动态数据源的实现方法,希望能够帮助到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 动态数据源的实现方法(Mybatis+Druid) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java SpringSecurity+JWT实现登录认证

    一、什么是Java Spring Security和JWT? Java SpringSecurity是Spring框架中的一个安全工具,能够提供身份验证、授权、防止csrf攻击等功能; JWT(JSON Web Token)是一种用于身份验证的开放标准(RFC 7519),它使用JSON格式在网络之间安全地传递信息。JWT具有轻量级、开放性、易于使用和便于传…

    Java 2023年5月20日
    00
  • Markdown基本语法

    Markdown 基本语法介绍 Markdown 是一种轻量级的标记语言,常用于编写文档和博客文章。它简单易学,具有清晰的结构和格式化效果,是非常适合写作和发布内容的工具。下面我们来介绍一些 Markdown 基本语法。 1. 标题 在 Markdown 中,可以使用 # 符号表示标题,一级标题使用一个 # 符号,二级标题使用两个 # 符号,以此类推,最多支…

    Java 2023年4月30日
    00
  • IDEA2020.1启动SpringBoot项目出现java程序包:xxx不存在

    当使用IDEA 2020.1版本启动Spring Boot项目时,可能会遇到以下错误提示: java程序包:xxx不存在 这个错误通常是由于项目的依赖项有问题导致的。为了解决这个问题,可以采取以下步骤: 步骤一:清除Maven本地仓库 打开命令行窗口,输入以下命令清除Maven本地仓库: mvn clean 这个命令会清除本地Maven仓库中的缓存文件。接下…

    Java 2023年5月19日
    00
  • Java常见的3种文件上传方法和速度对比

    关于Java常见的3种文件上传方法和速度对比,我可以提供以下完整攻略: Java常见的3种文件上传方法和速度对比 文件上传是现代web应用程序中常见的功能之一。在Java中,有许多方法可用于上传文件。在本篇文章中,将介绍Java中最常见的3种文件上传方法,并比较它们的速度和优缺点。 1. 原始Servlet API 在早期的Java Web项目中, Serv…

    Java 2023年5月19日
    00
  • 一起聊聊Java中13种锁的实现方式

    一起聊聊Java中13种锁的实现方式 背景介绍 在Java中使用锁是实现多线程同步的一种常用方式,也是保证程序并发安全的必要手段。本文将对Java中13种锁的实现方式进行详细讲解。 13种锁实现方式 1. synchronized关键字 synchronized关键字是Java中最基本、最常用的锁实现方式。它通过获取对象的锁来控制对对象的访问,进而实现多线程…

    Java 2023年5月19日
    00
  • java 多线程实现在线咨询(udp)

    Java 多线程实现在线咨询(UDP) 什么是在线咨询? 在线咨询是一种通过网络实现客户和客服之间咨询、沟通的服务形式。通过在线咨询,客户可以直接向客服提出问题,获取解决方案。在线咨询分为基于 Web 和基于客户端的两种形式。 UDP协议简介 UDP是一种无连接的协议,它基于 IP 协议。UDP 报文不需要建立连接,所以它轻巧快速,但是它无法保证数据传输的可…

    Java 2023年5月18日
    00
  • 关于SpringMVC在Controller层方法的参数解析详解

    关于SpringMVC在Controller层方法的参数解析详解 在SpringMVC中,Controller层是处理请求的核心部分。在Controller层的方法中,我们需要对请求参数进行解析,以便正确地处理请求。本文将详细介绍SpringMVC在Controller层方法中的参数解析方法,并提供两个示例来说明这些方法的使用。 方法一:使用@Request…

    Java 2023年5月17日
    00
  • 详解Idea SpringBoot搭建SpringCloud的准备工作(推荐)

    详解Idea Spring Boot搭建Spring Cloud的准备工作 Spring Cloud是一个流行的微服务框架,可以帮助开发人员构建和部署分布式应用程序。在本文中,我们将详细讲解如何使用Idea和Spring Boot搭建Spring Cloud的准备工作。 步骤1:安装Idea 首先,我们需要安装Idea,这是一个流行的Java IDE,可以帮…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部