Springboot mybais配置多数据源过程解析

下面就详细讲解“Springboot mybais配置多数据源过程解析”的完整攻略。

一、引入依赖

首先,我们需要在pom.xml文件中引入相关的依赖,具体如下:

<dependencies>
    <!--SpringBoot启动器-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.5.5</version>
    </dependency>
    <!--Mybatis依赖-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!--Mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
</dependencies>

二、配置application.properties

application.properties文件中,我们需要配置相关的数据源信息,具体如下所示:

# 主数据源
spring.datasource.master.url=jdbc:mysql://localhost:3306/master_database?useSSL=false&serverTimezone=UTC
spring.datasource.master.username=root
spring.datasource.master.password=123456
spring.datasource.master.driver-class-name=com.mysql.jdbc.Driver

# 从数据源
spring.datasource.slave.url=jdbc:mysql://localhost:3306/slave_database?useSSL=false&serverTimezone=UTC
spring.datasource.slave.username=root
spring.datasource.slave.password=123456
spring.datasource.slave.driver-class-name=com.mysql.jdbc.Driver

三、配置DataSource及SqlSessionFactory

@Configuration
@MapperScan(basePackages = {"com.example.demo.mapper"})
public class DataSourceConfiguration {

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

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

    @Bean(name = "dynamicDataSource")
    public DynamicDataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                                               @Qualifier("slaveDataSource") DataSource slaveDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DataSourceEnum.MASTER.getName(), masterDataSource);
        targetDataSources.put(DataSourceEnum.SLAVE.getName(), slaveDataSource);
        DynamicDataSource dynamicDataSource = new DynamicDataSource(masterDataSource, targetDataSources);
        return dynamicDataSource;
    }

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DynamicDataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml");
        bean.setMapperLocations(resources);
        return bean.getObject();
    }

    @Bean(name = "sqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

四、自定义DynamicDataSource

public class DynamicDataSource extends AbstractRoutingDataSource {

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

    private Object defaultDataSource;
    private Object readDataSource;
    private Map<Object, Object> targetDataSources;

    public DynamicDataSource(Object defaultDataSource, Map<Object, Object> targetDataSources) {
        this.defaultDataSource = defaultDataSource;
        this.targetDataSources = targetDataSources;
    }

    public void setReadDataSource(Object readDataSource) {
        this.readDataSource = readDataSource;
    }

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

    @Override
    public void afterPropertiesSet() {
        setDefaultTargetDataSource(defaultDataSource);
        setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
    }

    public static void setDataSource(String name) {
        contextHolder.set(name);
    }

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

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

}

五、定义数据源枚举类

public enum DataSourceEnum {

    MASTER("masterDataSource"),
    SLAVE("slaveDataSource");

    private String name;

    DataSourceEnum(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

六、使用

在需要使用的方法上标注使用哪个数据源,如下所示:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserDao userDao;

    @Override
    public List<User> getUsers() {
        DynamicDataSource.setDataSource(DataSourceEnum.MASTER.getName());
        return userDao.getUsers();
    }

    @Override
    public List<User> getSlaveUsers() {
        DynamicDataSource.setDataSource(DataSourceEnum.SLAVE.getName());
        return userDao.getUsers();
    }
}

七、示例说明

示例一:查询主数据源

在使用主数据源查询用户列表时,我们可以去除@DataSource注解,使用默认数据源即可。代码示例如下:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserDao userDao;

    @Override
    public List<User> getUsers() {
        return userDao.getUsers();
    }

}

示例二:查询从数据源

在使用从数据源查询用户列表时,我们需要在方法上加上自定义的@DataSource注解,如下所示:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserDao userDao;

    @DataSource(name = DataSourceEnum.SLAVE)
    @Override
    public List<User> getSlaveUsers() {
        return userDao.getUsers();
    }
}

以上就是“Springboot mybais配置多数据源过程解析”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot mybais配置多数据源过程解析 - Python技术站

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

相关文章

  • Windows下MySQL日志基本的查看以及导入导出用法教程

    当我们在开发或者维护一个网站的时候,MySQL的日志功能是非常重要的,通过查看MySQL的日志文件,我们可以了解到MySQL的操作状态、错误原因等等,进而帮助我们解决问题。 本文将介绍在Windows下如何查看MySQL日志文件,并将日志导入以及导出操作,为大家提供一个基本的教程。 查看MySQL日志 检查MySQL日志是否启用 在MySQL启动后,我们可以…

    database 2023年5月22日
    00
  • 深入理解MySQL索引底层数据结构

    在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没有思考过,为什么加了索引就会能提高SQL的查询效率,为什么有时候加了索引SQL执行反而会没有变化,本文就从MySQL索引的底层数据结构和算法来进行详…

    2023年4月8日
    00
  • mysqld是什么意思?如何卸载mysqld?

    mysqld是MySQL数据库服务程序的主进程。它负责启动MySQL服务器,监听客户端的连接请求,处理客户端的查询请求,并负责管理MySQL的所有数据和索引等。 如果我们需要卸载mysqld,可以按照以下步骤进行操作: Step 1. 停止mysqld服务 在终端中输入以下命令可以停止mysqld服务: sudo systemctl stop mysqld …

    database 2023年5月22日
    00
  • mysql时间戳转成常用可读时间格式的两种方法

    下面我将详细讲解如何将 MySQL 的时间戳转换成常用的可读时间格式。我将介绍两种方法,分别是使用 MySQL 函数和使用 PHP 函数。 方法一:使用 MySQL 函数 MySQL 中有几个转换时间戳的函数,最常用的有 FROM_UNIXTIME 和 DATE_FORMAT,分别可以将时间戳转换成标准日期时间格式和自定义格式。 1. 用 FROM_UNIX…

    database 2023年5月22日
    00
  • 强制SQL Server执行计划使用并行提升在复杂查询语句下的性能

    要强制SQL Server执行计划使用并行提升复杂查询语句的性能,可以通过以下步骤: 查看查询的执行计划,判断是否适合并行执行。可使用SQL Server Management Studio的“执行计划”功能或使用以下命令查看执行计划: SET SHOWPLAN_ALL ON; GO — 输入你的查询语句 GO SET SHOWPLAN_ALL OFF; …

    database 2023年5月21日
    00
  • 离线安装redis集群

      Step0:redis集群组件需求 Step1:离线安装ruby Step2:离线安装rubygems Step3:安装rubygems的 redis api Step4:离线安装tcl 8.6 Step5:离线安装redis Step6:启动redis守护进程及配置主从复制 Step7:测试redis集群     Step0:redis集群需要安装如下…

    Redis 2023年4月12日
    00
  • demo项目开发(Python+flask+mysql+redis只包含后端接口)

    【demo项目开发需求】 用户信息管理,可以注册、登录、添加用户、删除用户 注册:任何用户可以注册,对用户提交的注册信息进行校验,返回对应的信息,其中:   用户名:必填,唯一   密码:必填,只能6-12位,入库是加盐加密   真实名:必填   性别:非必填,只能0(male)或者1(female)   电话:必填,唯一,满足电话要求,数字,且11位 登录…

    MySQL 2023年4月12日
    00
  • 使用Docker部署 spring-boot maven应用的方法

    使用Docker来部署Spring Boot Maven应用程序是显得很方便且快速的。下面我们将详细讲解如何通过两个示例来运用它。 一、Docker 部署 Spring Boot Maven 应用的准备工作 在开始示例之前,请先完成以下准备工作: 在本机安装了 Docker 环境 在本机安装了 Maven,确保能够执行 mvn 命令 一个 Spring Bo…

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