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日

相关文章

  • Spring事物的传播特性详解

    Spring 事务的传播特性详解 在开发中,我们常常需要对数据进行事务管理,保证多条SQL语句的原子性,不仅加强了应用程序的稳定性,而且能够提高并发性,减少资源的消耗。Spring事务是优秀的事务管理框架之一,其中最重要的概念就是事务的传播特性。 什么是事务的传播特性 传播特性是指事务的一个属性,当一个事务方法调用另一个事务方法时,称被调用的事务方法为 被嵌…

    database 2023年5月21日
    00
  • C# SQLite执行效率的优化教程

    C# SQLite执行效率的优化主要从以下几个方面入手: 1. 数据库设计优化 在数据库设计时,应遵循以下原则进行优化: 1.1 表字段设计 表字段设计时,应尽量避免使用BLOB(二进制类型)和TEXT类型,这类字段需要频繁的I/O操作和内存申请,对性能会造成不小的影响。如果确实需要使用这类字段,可以通过异步读写或者考虑分表进行优化。 1.2 索引优化 索引…

    database 2023年5月19日
    00
  • 深入讲解SQL中的字符串拼接

    下面是深入讲解SQL中的字符串拼接的完整攻略。 标题:深入讲解SQL中的字符串拼接 一、什么是字符串拼接 字符串拼接是将两个或多个字符串连接起来,形成一个新字符串的操作。在SQL语言中,字符串拼接一般通过一些特定的运算符或函数来实现。 二、SQL中字符串拼接的运算符 SQL中字符串拼接一般使用“+”运算符,具体使用方式如下: SELECT column1 +…

    database 2023年5月18日
    00
  • Oracle 跨库 查询 复制表数据 分布式查询介绍

    Oracle跨库查询 在Oracle中,可以通过数据库链接实现跨库查询,具体步骤如下: 创建远程数据库链接 可以使用以下语句创建远程数据库链接: CREATE DATABASE LINK db_link_name CONNECT TO username IDENTIFIED BY password USING ‘tns_name’; 其中,db_link_n…

    database 2023年5月21日
    00
  • MySQL 查询速度慢与性能差的原因与解决方法

    下面就来一步步讲解一下“MySQL 查询速度慢与性能差的原因与解决方法”的完整攻略。 原因分析 MySQL 查询速度慢与性能差的原因可能包括以下几个方面: 硬件设备 硬件设备的性能对 MySQL 的查询速度有很大的影响。如果你的服务器性能较低,那么 MySQL 的查询速度也会变得很慢。可以通过升级硬件设备、加大缓存等方式来提升 MySQL 的查询速度。 锁 …

    database 2023年5月19日
    00
  • MySQL删除数据库表

    MySQL的删除表操作是一种很常见的操作,它可以用来删除数据库中不再需要的表,以便释放存储空间和优化数据库性能。MySQL提供了多种不同的方法来删除表,下面将详细介绍其中的几种方法,并结合实例说明。 使用DROP TABLE语句删除表 使用DROP TABLE语句是MySQL中最常见和最方便的删除表的方法。这种方法只需要使用一个简单的SQL语句就可以删除指定…

    MySQL 2023年3月9日
    00
  • PostgreSQL中json数据类型详解

    PostgreSQL中json数据类型详解 什么是json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 JSON格式中的数据可以被任何编程语言读取和解析,因为它使用了键值对的形式。此外,JSON是一种自文档化的数据结构。 PostgreSQL 中的json PostgreSQL支持JSON格式的存储、查询和…

    database 2023年5月19日
    00
  • 【Azure Cache for Redis】Python Djange-Redis连接Azure Redis服务遇上(104, ‘Connection reset by peer’)

    问题描述 使用Python连接Azure Redis服务,因为在代码中使用的是Djange-redis组件,所以通过如下的配置连接到Azure Redis服务: CACHES = { “default”: { “BACKEND”: “django_redis.cache.RedisCache”, “LOCATION”: “redis://xxxxxxxxx.…

    Redis 2023年4月10日
    00
合作推广
合作推广
分享本页
返回顶部