SpringBoot项目中如何实现MySQL读写分离详解

yizhihongxing

要实现MySQL读写分离,我们需要用到SpringBoot框架中的多数据源配置。

首先,在SpringBoot的application.properties文件中添加连接主库的配置:

#主数据源配置
spring.datasource.url=jdbc:mysql://主库地址:3306/数据库名称
spring.datasource.username=主库用户名
spring.datasource.password=主库密码
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#连接池配置
#初始化时建立物理连接的个数
spring.datasource.initialSize=5
#最小连接池数量
spring.datasource.minIdle=5
#最大连接池数量
spring.datasource.maxActive=20
#获取连接时最大等待时间,单位毫秒
spring.datasource.maxWait=60000

#druid监控配置
spring.datasource.filters=stat,wall
spring.datasource.stat-view-servlet.allow=true
spring.datasource.web-stat-filter.enabled=true

#开启Druid的监控统计功能
spring.datasource.druid.monitoring.enable=true
# 合并多个DruidDataSource的监控数据
spring.datasource.druid.stat.mergeSql=true
spring.datasource.druid.stat.slowSqlMillis=5000
spring.datasource.druid.filter.stat.log-slow-sql=true

然后,在application.properties文件中添加连接从库的配置:

#从数据源1,即读数据库配置
spring.datasource.slave1.url=jdbc:mysql://从库1地址:3306/数据库名称
spring.datasource.slave1.username=从库1用户名
spring.datasource.slave1.password=从库1密码
spring.datasource.slave1.driverClassName=com.mysql.jdbc.Driver
spring.datasource.slave1.type=com.alibaba.druid.pool.DruidDataSource

#从数据源2,即读数据库配置
spring.datasource.slave2.url=jdbc:mysql://从库2地址:3306/数据库名称
spring.datasource.slave2.username=从库2用户名
spring.datasource.slave2.password=从库2密码
spring.datasource.slave2.driverClassName=com.mysql.jdbc.Driver
spring.datasource.slave2.type=com.alibaba.druid.pool.DruidDataSource

#设置mybatis的mapper文件地址
mybatis.mapper-locations=classpath:mapper/**/*.xml

#JPA自动创建数据表
spring.jpa.hibernate.ddl-auto=update

#开启Druid的监控统计功能
spring.datasource.slave1.druid.stat-view-servlet.allow=true
spring.datasource.slave1.druid.web-stat-filter.enabled=true
spring.datasource.slave1.druid.filters=stat,wall
spring.datasource.slave1.druid.initialSize=1
spring.datasource.slave1.druid.minIdle=1
spring.datasource.slave1.druid.maxActive=20
spring.datasource.slave1.druid.maxWait=60000
spring.datasource.slave1.druid.stat.mergeSql=true
spring.datasource.slave1.druid.stat.slowSqlMillis=5000
spring.datasource.slave1.druid.filter.stat.log-slow-sql=true

#开启Druid的监控统计功能
spring.datasource.slave2.druid.stat-view-servlet.allow=true
spring.datasource.slave2.druid.web-stat-filter.enabled=true
spring.datasource.slave2.druid.filters=stat,wall
spring.datasource.slave2.druid.initialSize=1
spring.datasource.slave2.druid.minIdle=1
spring.datasource.slave2.druid.maxActive=20
spring.datasource.slave2.druid.maxWait=60000
spring.datasource.slave2.druid.stat.mergeSql=true
spring.datasource.slave2.druid.stat.slowSqlMillis=5000
spring.datasource.slave2.druid.filter.stat.log-slow-sql=true

然后,我们需要添加一个数据源配置类,来配置主库与从库的动态切换:

@Configuration
public class DataSourceConfiguration {

/**
 * 配置主库数据源
 * @return
 * @throws SQLException
 */
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource masterDataSource() throws SQLException {
    DruidDataSource druidDataSource = new DruidDataSource();
    return druidDataSource;
}

/**
 * 配置第一个从库数据源
 * @return
 * @throws SQLException
 */
@Bean(name = "slave1DataSource")
@ConfigurationProperties(prefix="spring.datasource.slave1")
public DruidDataSource slave1DataSource() throws SQLException {
    DruidDataSource druidDataSource = new DruidDataSource();
    return druidDataSource;
}

/**
 * 配置第二个从库数据源
 * @return
 * @throws SQLException
 */
@Bean(name = "slave2DataSource")
@ConfigurationProperties(prefix="spring.datasource.slave2")
public DruidDataSource slave2DataSource() throws SQLException {
    DruidDataSource druidDataSource = new DruidDataSource();
    return druidDataSource;
}

@Bean(name = "dynamicDataSource")
public DataSource dynamicDataSource() throws SQLException {
    DynamicDataSource dynamicDataSource = new DynamicDataSource();

    //配置主库数据源
    DruidDataSource masterDataSource = masterDataSource();
    dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
    dynamicDataSource.setMasterDataSource(masterDataSource);

    //配置从库数据源
    DruidDataSource slave1DataSource = slave1DataSource();
    DruidDataSource slave2DataSource = slave2DataSource();
    Map<Object,Object> map=new HashMap<Object, Object>();
    map.put(DynamicDataSourceGlobal.SLAVE1, slave1DataSource);
    map.put(DynamicDataSourceGlobal.SLAVE2, slave2DataSource);

    dynamicDataSource.setTargetDataSources(map);

    return dynamicDataSource;
}

}

最后,在服务层或dao层中可以使用注解来指定使用哪个数据源。例如:

@Service
public class UserService {

@Autowired
private UserMapper userMapper;

@DataSource(DynamicDataSourceGlobal.MASTER)
public void addUser(User user){
    userMapper.addUser(user);
}

@DataSource(DynamicDataSourceGlobal.SLAVE1)
public User getUserById(String id){
    return userMapper.getUserById(id);
}

@DataSource(DynamicDataSourceGlobal.SLAVE2)
public List<User> getUserList(){
    return userMapper.getUserList();
}

}

这样一来,就完成了SpringBoot项目中的MySQL读写分离搭建。

示例:在主库和两个从库的数据表中各建立一个users表,然后在服务层的方法中添加、查询用户数据,使其分别使用主库和两个从库,查看数据库的连接情况和执行结果,验证读写分离配置的有效性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot项目中如何实现MySQL读写分离详解 - Python技术站

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

相关文章

  • CentOS MySQL 5.7编译安装步骤详细说明

    以下是CentOS MySQL 5.7编译安装的详细步骤: 1. 下载MySQL安装包 去MySQL官方网站,选择下载MySQL 5.7版本的源码压缩包(tar.gz格式),例如:mysql-5.7.33.tar.gz 2. 安装编译工具和依赖库 使用以下命令安装编译器、自动化构建工具和MySQL编译所需的依赖库: yum install -y wget m…

    database 2023年5月22日
    00
  • SQL WHERE 条件查询

    关于 SQL WHERE 条件查询,以下是完整的攻略及两个实例: SQL WHERE 条件查询 概述 SQL 是结构化查询语言,它可以用来操作关系型数据库。WHERE 是 SQL 的一个子句,用来过滤 SELECT 操作所查询到的记录。 符合 WHERE 条件的记录会被 SELECT 语句返回,而不符合的则会被忽略。在 WHERE 条件中,可以使用比较运算符…

    database 2023年3月27日
    00
  • MYSQL函数的使用梳理

    MYSQL函数的使用梳理 MYSQL是一种常用的关系型数据库管理系统,在使用中,函数是不可或缺的组成部分。MYSQL函数主要分为以下几类:数值函数、日期时间函数、字符处理函数、聚合函数和控制流函数。下面对这几种函数一一进行介绍。 数值函数 ABS ABS函数用于返回一个数的绝对值。例如: SELECT ABS(-10); // 输出10 ROUND ROUN…

    database 2023年5月22日
    00
  • Windows 和 Linux 上Redis的安装守护进程配置方法

    Redis是一种基于内存的键值对存储数据库,拥有高性能、可扩展、支持多种数据结构等特点,越来越受到开发者们的青睐。本篇攻略将为您介绍Redis在Windows和Linux上的安装及守护进程配置方法。 Windows上Redis的安装守护进程配置方法 1. 下载Redis 在 https://github.com/microsoftarchive/redis/…

    database 2023年5月22日
    00
  • MySQL自定义函数简单用法示例

    下面我将为您讲解MySQL自定义函数的用法示例攻略,包含以下几个部分: 自定义函数介绍 MySQL中,自定义函数是一种用户自定义的函数,可以像系统自带函数一样被调用,方便用户在执行SQL语句时进行各类自定义操作。 自定义函数使用方法 2.1 创建自定义函数使用CREATE FUNCTION语句进行创建,一般包括函数名称、参数列表、返回值数据类型、函数体等四部…

    database 2023年5月22日
    00
  • redis安装、配置、使用和redis php扩展安装教程

    下面就来详细讲解一下“redis安装、配置、使用和redis php扩展安装教程”的完整攻略。 redis安装 下载redis 官网下载地址:https://redis.io/download,我们选择稳定版的最新版本。下载完成后,解压到我们希望的路径下。 安装redis 进入到redis目录,执行make命令进行编译,再执行make install命令将编…

    database 2023年5月18日
    00
  • mysql 锁表锁行语句分享(MySQL事务处理)

    MySQL锁分为表级锁和行级锁。在多个事务同时访问同一个数据库的时候,为了保证数据的一致性和完整性,需要使用锁机制来避免数据并发访问时出现的问题。下面我将详细介绍MySQL中的锁表锁行语句。 一、MySQL锁的分类 MySQL锁分类如下: 共享锁:允许多个事务同时持有同一把锁,用于读取操作。 排他锁:只允许一个事务持有锁,用于写操作。 表级锁:对整张表进行锁…

    database 2023年5月22日
    00
  • linux怎么调整swap大小? linux扩容swap分区的技巧

    Linux系统使用swap来扩展内存,当内存不足时,会将不常用的内存数据写入swap分区中。如果swap分区空间不足,就需要调整swap的大小。本文将介绍如何调整swap分区大小和Linux扩容swap分区的技巧。 调整swap分区大小 步骤1:查看当前swap分区情况 使用free -h命令查看当前的swap分区情况,如下所示: $ free -h tot…

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