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

要实现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日

相关文章

  • MySQL定位并优化慢查询sql的详细实例

    MySQL定位并优化慢查询SQL的详细实例 背景 当我们的MySQL应用慢的时候,我们通常会使用慢查询日志来找出哪些查询语句是最慢的,以便优化它们并提高应用性能。下面将介绍如何使用慢查询日志找到慢查询SQL并进行优化。 步骤 1. 开启慢查询日志 在MySQL配置文件my.cnf中,将slow_query_log设置为1,并将log_slow_queries…

    database 2023年5月19日
    00
  • golang1.16新特性速览(推荐)

    Golang1.16新特性速览(推荐)攻略 Golang1.16版本推出了许多全新的特性,本文将为你详细介绍各项新特性及其使用方法。 Embeddings 新版本中,可以使用Embeddings机制来将一个结构体嵌套到另一个结构体中,同时在使用过程中可以直接访问这两个结构体的方法和属性。下面是一个简单的示例: type Person struct { Nam…

    database 2023年5月22日
    00
  • 深入浅出的学习Mysql

    深入浅出的学习MySQL攻略 如果您想深入学习MySQL数据库,以下是一些步骤和示例,可以让您从初学者到初级用户,再到专家。 步骤1: 安装MySQL 首先,您需要在您的计算机上安装MySQL。您可以官方网站找到适合您系统的版本。安装后,请务必设置root账户密码,然后启动MySQL服务。 步骤2: 学习SQL基础知识 学习SQL是学习MySQL的基础。您需…

    database 2023年5月19日
    00
  • Excel导入数据库时出现的文本截断问题解决方案

    当我们使用Excel导入数据库时,可能会遇到导入文本数据时被截断的问题,造成数据不完整,这时我们需要解决这个问题。 问题背景 在使用Excel导入数据库时,以CSV格式保存Excel文件,可以通过数据导入向导进行数据导入。但是,在导入文本数据时,极有可能产生文本截断的问题。 解决方法 解决文本截断问题有两种常见方法: 方法一:增加导入列的宽度 可以将数据导入…

    database 2023年5月21日
    00
  • 如何使用Python获取MySQL中的表的列数?

    要使用Python获取MySQL中的表的列数,可以使用Python的内置模块sqlite3或第三方库mysql-connector-python。以下是使用mysql-connector-python在MySQL中获取表的列数的完整攻略: 连接 要连接到MySQL,需要提供MySQL的主机、用户名、和密码。可以使用以下代码连接: mysql.connecto…

    python 2023年5月12日
    00
  • MongoDB插入文档使用方法(详解版)

    MongoDB是一种流行的文档数据库,非常灵活和易于使用。文档是MongoDB的核心概念,因此在使用MongoDB时,插入文档将是我们的第一步。 下面我们将详细解释MongoDB插入文档的完整攻略。 步骤1:连接MongoDB数据库 在使用MongoDB之前,首先需要连接数据库。根据您的需求,您可以连接到本地或远程数据库。MongoDB的默认端口是27017…

    MongoDB 2023年3月14日
    00
  • MySQL创建存储过程(CREATE PROCEDURE)

    MySQL创建存储过程的方法: 在MySQL中创建存储过程需要使用CREATE PROCEDURE语句,并指定存储过程的名称; 设置存储过程的参数、返回值、执行体等信息; 使用END语句来结束存储过程。 MySQL创建存储过程的示例: 如下片段是创建一个简单的 MySQL 存储过程的示例: DELIMITER // CREATE PROCEDURE get_…

    MySQL 2023年3月10日
    00
  • MySQL InnoDB架构的相关总结

    MySQL InnoDB架构的相关总结 MySQL InnoDB是MySQL一种常用的存储引擎,它是一个支持事务的存储引擎。相比其他存储引擎,InnoDB具有以下的优点: 支持事务和ACID属性 支持行级锁定 其数据缓存(buffer pool)较大且可动态扩展 支持外键约束 支持MVCC(多版本并发控制)等高级特性 InnoDB架构 InnoDB的架构分为…

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