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

yizhihongxing

下面就详细讲解“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日

相关文章

  • Linux中的EXT系列文件系统格式详解

    Linux中的EXT系列文件系统格式详解 什么是EXT文件系统 EXT是Linux系统上广泛使用的一种文件系统。它是一种磁盘分区格式,用于在Linux系统上存储数据。EXT文件系统支持文件和文件夹层次结构,并允许用户通过文件名、文件夹名或权限来管理文件和文件夹。 EXT系列文件系统格式 在Linux系统中,常规使用的EXT文件系统格式有如下几种: EXT2 …

    database 2023年5月22日
    00
  • WEB服务器

    WEB服务器是一种能够接收来自客户端的HTTP请求并返回HTTP响应的计算机程序或设备。下面是WEB服务器的完整攻略: 什么是WEB服务器 WEB服务器是一种运行特定软件的计算机程序或设备,它能够接收来自客户端的HTTP请求、并返回HTTP响应。WEB服务器可以托管网站、网页、应用程序和其他数据,以便在互联网上供其他人访问。 WEB服务器最常用的HTTP服务…

    database 2023年5月22日
    00
  • redis删除指定key的实现步骤

    Redis是一种高性能的键值对存储系统,删除指定key在实际中用得非常频繁。下面,我将详细讲解Redis删除指定key的实现步骤,希望能够帮助你更好地使用Redis。 步骤一:确定要删除的key 首先,确定需要删除的key。可以使用Redis的KEYS命令或SCAN命令来获取指定规则的key列表。 redis-cli> keys * 1) "…

    database 2023年5月22日
    00
  • 使用nginx模拟进行金丝雀发布的方式

    金丝雀发布(Canary release)是将一部分流量新版本的应用程序,同时保留部分流量旧版本的应用程序的一种技术,目的是减少应用程序的风险和对用户的影响。Nginx是一个自由、开源、高性能、轻量级的HTTP服务器和反向代理服务器,可以用来模拟进行金丝雀发布的方式。下面是详细的攻略: 1. 安装Nginx服务器 安装Nginx服务器可以参考其官方网站提供的…

    database 2023年5月22日
    00
  • 29_对项目的redis cluster实验多master写入、读写分离、高可用性

    redis cluster搭建起来了 redis cluster,提供了多个master,数据可以分布式存储在多个master上; 每个master都带着slave,自动就做读写分离; 每个master如果故障,那么久会自动将slave切换成master,高可用 redis cluster的基本功能,来测试一下 1、实验多master写入 -> 海量数…

    Redis 2023年4月11日
    00
  • Linux下编译安装Mysql 5.5的简单步骤

    以下是详细的Linux下编译安装MySQL 5.5的攻略: 准备工作 确保系统中已经安装了必要的依赖项,包括 cmake 和 gcc。如果没有安装,请使用以下命令安装: sudo apt-get install cmake gcc 下载并解压MySQL的源代码,可以从官网下载。解压后的文件夹名称为mysql-5.5.**,其中**代表版本号。 编译并安装 进…

    database 2023年5月22日
    00
  • SQL 经典语句

    下面是SQL经典语句的完整攻略。 介绍 SQL是Structured Query Language的缩写,Structured Query Language即结构化查询语言,是关系型数据库系统的标准语言。SQL经典语句是SQL语言中的重要部分,能够帮助开发者快速高效的管理数据,操作数据库。 SQL语句分类 SQL语句主要分为以下几类: 数据查询语言(Data…

    database 2023年5月21日
    00
  • PHP连接MySQL的2种方法小结以及防止乱码

    接下来我会为您详细讲解“PHP连接MySQL的2种方法小结以及防止乱码”的完整攻略。 PHP连接MySQL的2种方法小结 方法1:使用MySQLi扩展连接MySQL 首先需要通过mysqli_connect()函数连接MySQL数据库,该函数的参数包含主机名、用户名、密码和数据库名等信息。 $con = mysqli_connect("localh…

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