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存储引擎?

    MySQL是一个开源的关系型数据库管理系统,拥有多种存储引擎(Storage Engine),不同的引擎具有不同的特点和性能表现。可通过修改数据表的存储引擎来优化数据库的性能。 存储引擎介绍 MySQL支持的存储引擎较多,具体如下: 1 InnoDB:支持ACID事务,并发性高,行级锁定、MVCC、自适应哈希索引、为外键提供支持。 2 MyISAM:不支持事…

    MySQL 2023年3月9日
    00
  • 【Redis技术专区】「优化案例」谈谈使用Redis慢查询日志以及Redis慢查询分析指南

    前提介绍 本篇文章主要介绍了Redis的执行的慢查询的功能的查询和配置功能,从而可以方便我们在实际工作中,进行分析Redis的性能运行状况以及对应的优化Redis性能的佐证和指标因素。 在我们5.0左右的版本中Redis使用单线程架构和I/O多路复用模型来实现高性能的内存数据服务。接下来主要分析Redis单线程命令处理机制,接着分析Redis单线程模型为什么…

    Redis 2023年4月11日
    00
  • Docker中redis集群部署实战

    针对Docker中redis集群部署实战的攻略,我可以提供以下步骤: 步骤一:创建Docker容器 首先需要创建Docker容器,可以使用以下命令进行创建: docker run –name redis -p 6379:6379 -d redis redis-server –appendonly yes 解释一下上述命令: –name 指定容器的名称 …

    database 2023年5月22日
    00
  • Hbase入门详解

    HBase入门详解攻略 什么是HBase Apache HBase是一个分布式、可伸缩、面向列的NoSQL数据库,基于Hadoop HDFS构建,拥有高可用性、高扩展性、高可靠性等优势。它主要面向海量、流式数据的实时读写访问,是一个可以存储海量半结构化数据的分布式数据库。 安装和配置HBase 安装HBase 下载并解压HBase压缩包 shell wget…

    database 2023年5月22日
    00
  • Oracle 轻量级实时监控工具 oratop详解

    Oracle 轻量级实时监控工具 oratop详解 介绍 oratop是一种轻量级的实时监控工具,专门用于监控Oracle数据库实例。它可以显示出许多数据库的关键指标,例如CPU、I / O、并发连接、等待事件等。oratop 使用 ncurses 库实现基于文本和图形的用户界面。 安装 oratop的安装非常简单,我们只需要从官网下载安装文件,然后通过ro…

    database 2023年5月22日
    00
  • MongoDB删除集合

    删除MongoDB中的集合可以使用db.collection.drop()方法。这个方法可以接收一个留给可选参数的布尔值,指定是否完成删除集合的同时也删除了它的索引。 下面是删除一个名为 ‘myColl’ 的集合的代码示例: db.myColl.drop() 如果需要强制删除操作,则可以使用{force:true}选项: db.myColl.drop({fo…

    MongoDB 2023年3月14日
    00
  • MySQL线上死锁分析实战

    MySQL线上死锁分析是一个非常重要的工作,对于数据库管理员和开发者来说都具有重要的意义,下面是一个完整的攻略: 1. 收集信息 在进行死锁分析之前,我们需要收集一些信息来确定死锁的原因,包括: 发生死锁的时间 相关的SQL语句 数据库服务的版本 数据库表结构 不同的连接类型 2. 查看日志文件 在MySQL中,我们可以通过查看日志文件来获取死锁的相关信息。…

    database 2023年5月22日
    00
  • Linux安装Redis、后台运行、系统自启动的设置方法

    下面是“Linux安装Redis、后台运行、系统自启动的设置方法”的完整攻略。 安装Redis 打开终端,输入以下命令: sudo apt update sudo apt install redis-server 安装完成后,检查是否成功安装Redis: redis-cli ping 如果返回“PONG”,说明Redis已经成功开启。 后台运行Redis 编…

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