MySQL主从架构配合ShardingJdbc实现读写分离

文章目录

目录

架构搭建

基于Docker去创建MySQL的主从架构

读写分离

pom.xml

xml 复制代码
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${fdy-mysql.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>${sharding.jdbc.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>${snakeyaml.version}</version>
</dependency>

fdy-live-user-provider 模块

application.yml
yaml 复制代码
spring:
  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:classpath:fdy-db-sharding.yaml
    # 设置连接池的全局属性
    hikari:
      pool-name: fdy-user-pool
      minimum-idle: 15 # 初始化连接池
      maximum-pool-size: 300
      connection-init-sql: select 1
      connection-timeout: 4000
      max-lifetime: 60000

logging:
  level:
    org.apache.shardingsphere: DEBUG
    com.zaxxer.hikari: DEBUG
fdy-db-sharding.yaml
yaml 复制代码
dataSources:
  user_master: ##新表,重建的分表
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver  # 统一为 driverClassName
    jdbcUrl: jdbc:mysql://192.168.56.101:8808/fdy_live_user?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
  user_slave0: ##新表,重建的分表
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver  # 统一为 driverClassName
    jdbcUrl: jdbc:mysql://192.168.56.101:8809/fdy_live_user?useUnicode=true&characterEncoding=utf8
    username: root
    password: root

rules:
  - !READWRITE_SPLITTING
    dataSources:
      #读写分离配置
      user_ds:
        staticStrategy:
          writeDataSourceName: user_master
          readDataSourceNames:
            - user_slave0
  - !SINGLE
    #  不分表分分库的默认数据源
    defaultDataSource: user_ds
  - !SHARDING
    tables:
      t_user:
        actualDataNodes: user_ds.t_user_${(0..04).collect(){it.toString().padLeft(2,'0')}}
        tableStrategy:
          standard:
            #指定用于分表的列名。
            shardingColumn: user_id
            shardingAlgorithmName: t_user-inline

    #定义分表算法
    shardingAlgorithms:
      t_user-inline:
        type: INLINE
        props:
          #根据"user_id"对5取模的结果将作为分表的后缀,范围为00到04,对应五个表,并在左侧填充0。
          algorithm-expression: t_user_${(user_id % 5).toString().padLeft(2,'0')}
props:
  sql-show: true
ShardingJdbcDatasourceAutoInitConnectionConfig.java

java\org\fdy\live\user\provider\config\ShardingJdbcDatasourceAutoInitConnectionConfig

java 复制代码
package org.fdy.live.user.provider.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.sql.Connection;

/**
 * @author lee
 * @description 解决hikari存在bug, 强制hikari进行数据源的初始化操作
 */
@Slf4j
@Configuration
public class ShardingJdbcDatasourceAutoInitConnectionConfig {

    @Bean
    public ApplicationRunner runner(DataSource dataSource) {
        return args -> {
            log.info("dataSource: {}", dataSource);
            // 手动触发下连接池的连接创建
            Connection connection = dataSource.getConnection();
//            try (Connection connection = dataSource.getConnection()){}
        };
    }
}
相关推荐
倔强的石头_11 小时前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库
小白鼠幻想家13 小时前
Agent 上下文爆炸:200 万退款事故复盘
架构
SelectDB13 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
杉氧17 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
徐小夕18 小时前
jitword 协同文档3.2发布:打造浏览器中最强word编辑器
前端·架构·github
玉宇夕落20 小时前
Harness Engineering 核心四层一:记忆模块的简单学习
架构
BothSavage21 小时前
OpenHarness源码研究-3-codex配置到输出对话
后端·架构
杉氧2 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
杉氧2 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
Lion092 天前
ReAct 循环:Agent 的思考引擎 — Think → Act → Observe
架构