当前位置: 首页 > article >正文

springboot提升-多数据源配置

文章目录

      • 1. 添加依赖
      • 2. 配置数据源
        • 示例配置:
      • 3. 创建数据源 Bean
      • 4. 创建动态数据源
      • 5. 配置 MyBatis SqlSessionFactory
      • 6. 在业务代码中使用
      • 注意事项

在 Spring Boot 中配置 MyBatis 以支持多数据源涉及几个关键步骤,包括配置数据源、集成 MyBatis 以及动态数据源切换机制。以下是详细的配置步骤:

1. 添加依赖

确保你的项目中包含必要的依赖,例如 MySQL 驱动、Spring Boot Starter JDBC 或者 MyBatis 的相关依赖。

<!-- MySQL 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- Spring Boot JDBC Starter -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- MyBatis Starter -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>

2. 配置数据源

application.propertiesapplication.yml 文件中添加每个数据源的配置信息。

示例配置:
# 数据源1配置
spring.datasource.db1.url=jdbc:mysql://host1:3306/db1
spring.datasource.db1.username=user1
spring.datasource.db1.password=password1
spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver

# 数据源2配置
spring.datasource.db2.url=jdbc:mysql://host2:3306/db2
spring.datasource.db2.username=user2
spring.datasource.db2.password=password2
spring.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver

3. 创建数据源 Bean

在 Spring Boot 的配置类中,为每个数据源创建对应的 DataSource Bean。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {
    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource db1DataSource() {
        return DataSourceBuilder.create().build();
    }

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

4. 创建动态数据源

创建一个 DynamicDataSource 类来动态地改变当前线程绑定的数据源。

线程池切换范围在一个线程内, 如果涉及多个线程, 那么需要在线程范围内进行线程池切换

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

public class DynamicDataSource extends AbstractRoutingDataSource {

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

    public static void setDataSource(String dataSourceName) {
        CONTEXT_HOLDER.set(dataSourceName);
    }

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

    @Override
    protected Object determineCurrentLookupKey() {
        return CONTEXT_HOLDER.get();
    }

    public void afterPropertiesSet() {
        super.afterPropertiesSet();
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put("db1", db1DataSource);
        targetDataSources.put("db2", db2DataSource);
        setTargetDataSources(targetDataSources);
    }
}

5. 配置 MyBatis SqlSessionFactory

配置 SqlSessionFactory 来使用动态数据源。

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.mapper")
public class MyBatisConfig {

    @Autowired
    private DataSource dynamicDataSource;

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dynamicDataSource);
        factory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/*.xml"));
        return factory.getObject();
    }
}

6. 在业务代码中使用

在业务代码中使用之前定义的动态数据源,可以通过如下的方式直接切换数据源。也可以通过在方法上添加注解来指定使用哪个数据源,这里会涉及到切面的开发。

import com.example.datasource.DynamicDataSource;

public class Service {
    @Transactional(readOnly = true)
    public void serviceMethodForDb1() {
        DynamicDataSource.setDataSource("db1");
        // 操作 db1 数据源
        DynamicDataSource.clearDataSource();
    }

    @Transactional(readOnly = true)
    public void serviceMethodForDb2() {
        DynamicDataSource.setDataSource("db2");
        // 操作 db2 数据源
        DynamicDataSource.clearDataSource();
    }
}

注意事项

  • 确保事务管理正确配置,特别是在涉及多个数据源的事务处理中。
  • 数据源的选择逻辑应该清晰,并且易于维护。
  • 考虑到性能问题,频繁的数据源切换可能会导致性能下降,因此要权衡利弊。
  • 如果使用了事务管理器,请确保它支持多数据源场景下的事务处理。

以上步骤展示了如何在 Spring Boot 中配置 MyBatis 以支持多数据源。根据实际应用的需求,你可能需要调整某些配置细节。


http://www.kler.cn/a/298452.html

相关文章:

  • 基于SpringBoot的洗浴管理系统
  • Ruby语言的软件开发工具
  • 【蓝桥杯选拔赛真题60】C++寻宝石 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解
  • MFC读写文件实例
  • 每日一题-两个链表的第一个公共结点
  • 『SQLite』如何使用索引来查询数据?
  • Shell脚本综合案例(Linux篇)
  • Redis - 主从复制
  • mysql性能优化-冷热数据分离
  • TortoiseGit安装与配置(图文详细)
  • 速通GPT-2:Language Models are Unsupervised Multitask Learners全文解读
  • LDtk to Unity 大致流程和一些注意点
  • PyQT开发总结
  • LED会议一体机开启超微小间距COB高清显示在会议系统中的新乐章
  • yum源配置与静态配置地址
  • OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用
  • vue3项目中如何动态循环设置ref并获取使用
  • STM32看门狗
  • 2.1ceph集群部署准备-硬件及拓扑
  • 如何压缩pdf?2024帮助你轻松压缩pdf软件
  • 【自用14】C++俄罗斯方块-思路复盘4-此游戏更新完结
  • c++的静态成员
  • 诗风秦韵诗词学习画廊发展“1+6步走”
  • 详解BMP图片格式以及关于Verilog图像处理的仿真环境搭建
  • HTTP 三、http在springboot中得应用
  • 华为 HCIP-Datacom H12-821 题库 (12)