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日

相关文章

  • JSP的login程序代码

    下面我就来详细讲解一下“JSP的login程序代码”的完整攻略。 首先,我们需要明确对于一个login程序代码需要实现的功能是什么:用户输入用户名和密码,验证用户名和密码是否正确,如果正确就跳转到用户的主页,如果不正确则给出提示并重新输入。因此,我们需要实现以下几个步骤: 创建login页面,让用户输入用户名和密码。在这里我们可以使用HTML语言来实现,代码…

    Java 2023年6月15日
    00
  • spring配置扫描多个包问题解析

    在Spring应用程序中,我们可以使用@ComponentScan注解来指定要扫描的包。但是,有时我们需要扫描多个包,这时就需要解决“spring配置扫描多个包问题”。本文将详细介绍如何解决这个问题。 1. 扫描多个包的方法 在Spring应用程序中,我们可以使用@ComponentScan注解来指定要扫描的包。如果要扫描多个包,我们可以在@Componen…

    Java 2023年5月18日
    00
  • Springboot集成activity过程图解

    以下是关于“Springboot集成activity过程图解”的完整攻略。 步骤一:添加依赖 首先,在Spring Boot项目中添加依赖,以便可以使用activity。 在项目的pom.xml文件中添加以下依赖项: <dependency> <groupId>org.activiti</groupId> <arti…

    Java 2023年5月15日
    00
  • 详解SpringBoot中JdbcTemplate的事务控制

    详解SpringBoot中JdbcTemplate的事务控制 什么是JdbcTemplate JdbcTemplate是Spring框架提供的一个简化JDBC操作的模板类,通过JdbcTemplate可以避免传统JDBC操作中大量重复的样板代码,提高开发效率。JdbcTemplate中封装了大量常用操作方法,如查询、更新等。 什么是事务控制 事务是指具有原子…

    Java 2023年5月20日
    00
  • jQuery实现标签子元素的添加和赋值方法

    jQuery是JavaScript库中一个非常流行的家族,包含很多提高编程效率的快捷语法和易用性。其中一个重要的应用场景就是页面元素的动态操作和数据交互。在标签子元素的添加和赋值方法中,jQuery的语法极易上手,而且可扩展性非常强。 准备工作 在开始学习jQuery添加和赋值标签子元素的方法前,你需要先了解以下知识: jQuery库文件的引入; HTML基…

    Java 2023年6月15日
    00
  • MyBatis的嵌套查询解析

    MyBatis是一个非常强大的ORM框架,为开发人员提供了很多便利,其中嵌套查询是其功能之一,主要用于处理某个表或视图中某些字段需要查询其他表或视图得到对应值的情况。这里提供一个详细的攻略,帮助开发者掌握MyBatis中嵌套查询的使用。 什么是嵌套查询 嵌套查询是MyBatis中一种复杂的查询操作。它是在一个查询语句中,嵌套了另外的查询语句。在这个过程中,可…

    Java 2023年5月20日
    00
  • Java Apache Commons报错“URISyntaxException”的原因与解决方法

    “ControllerResourcesNotFoundException”是Java的Struts框架中的一个异常,通常由以下原因之一引起: 配置错误:如果配置文件中存在错误,则可能会出现此异常。例如,可能会使用错误的文件路径或文件名。 资源文件缺失:如果资源文件缺失,则可能会出现此异常。例如,可能会缺失struts.xml文件。 以下是两个实例: 例1 …

    Java 2023年5月5日
    00
  • MyBatis中多条件查询商品的三种方法及区别

    MyBatis中多条件查询商品的三种方法及区别 在开发中,往往需要根据多个条件来查询数据。MyBatis提供了多种方法来实现多条件查询,本文将介绍三种方法并分析它们之间的差异。 方法一:使用<if>标签 使用<if>标签的方式适用于查询条件较少的情况。我们需要在SQL语句中使用<if>标签来判断条件是否成立,如果成立则拼接…

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