springboot+shardingsphere实现读写分离和分库分表

目录

1.maven依赖

2.配置文件

2.1mybatis-plus配置

2.2 数据源配置

2.3 读写分离配置

2.4 分库分表配置

3.测试

4.druid监控配置

页面配置

监控配置

启动项目

5.遇到的问题


shardingsphere文档地址:

https://shardingsphere.apache.org/document/current/cn/quick-start/

 在线yml转换工具 在线yaml转properties-在线properties转yaml-ToYaml.com

1.maven依赖
<!-- druid 数据源,一定不能用druid-spring-boot-starter -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        <!--一定不能引入dynamic-datasource-spring-boot-starter包-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.0.0-beta</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-namespace</artifactId>
            <version>5.0.0-beta</version>
        </dependency>

注意 dynamic-datasource相关包不要引入,会冲突

2.配置文件
2.1mybatis-plus配置
#mybatis-plus配置
mybatis-plus:
  mapper-locations: classpath:/mybatis/mapper/*.xml
  #数据库实体类的包全路径,方便在mapper.xml中不许使用实体类的全路径,写类名就行(不区分大小写)
  type-aliases-package: com.example.dto
  configuration:
    #sql日志打印
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #开启驼峰命名匹配
    map-underscore-to-camel-case: true
  global-config:
    db-config:
      #逻辑删除
      logic-delete-value: 0
      logic-not-delete-value: 1
      logic-delete-field: deleted
 2.2 数据源配置
spring:
  shardingsphere:
    props:
      sql:
        show:
          true
    datasource:
      names: ds0,ds1,slave,master
      enabled: true
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test01?useUnicode=true&serverTimezone=GMT%2B8
        username: root
        password: 
        initialSize: 5
        minIdle: 10
        maxActive: 50
        maxWait: 6000
        timeBetweenEvictionRunsMillis: 300000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        validationQueryTimeout: 10
      ds1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test02?useUnicode=true&serverTimezone=GMT%2B8
        username: root
        password: 
        initialSize: 5
        minIdle: 10
        maxActive: 50
        maxWait: 6000
        timeBetweenEvictionRunsMillis: 300000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        validationQueryTimeout: 10
      slave:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test-slave?useUnicode=true&serverTimezone=GMT%2B8
        username: root
        password: 
      master:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test-master?useUnicode=true&serverTimezone=GMT%2B8
        username: root
        password: 

其中ds0,ds1是分库分表数据源,master,slave是读写分离数据源

2.3 读写分离配置
    rules:
      readwrite-splitting:
        data-sources:
          master-slave:
            write-data-source-name: master
            read-data-source-names:
              - slave
            load-balancer-name: roundRobin # 负载均衡算法名称
        load-balancers:
          roundRobin:
            type: ROUND_ROBIN # 一共两种一种是 RANDOM(随机),一种是 ROUND_ROBIN(轮询)
2.4 分库分表配置
   # 分片规则
    rules:
      sharding:
        sharding-algorithms:
          database-inline:
            props:
              algorithm-expression: ds$->{user_id % 2}
            type: INLINE
          table-inline:
            props:
              algorithm-expression: user_$->{(user_id % 5) % 2}
            type: INLINE
        tables:
          user:
            actual-data-nodes: ds$->{0..1}.user_$->{0..1}
            database-strategy:
              standard:
                sharding-algorithm-name: database-inline
                sharding-column: user_id
            table-strategy:
              standard:
                sharding-algorithm-name: table-inline
                sharding-column: user_id

user表 分2库,每个库分表2个表进行测试

3.测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class TestCut {
    @Resource
    private IUserMapper userDao;
    @Resource
    private IUserInfoMapper userInfoMapper;
    @Test
    public void test() {
        // 测试分库分表
        for (int i = 1; i < 50; i++) {
            User user = new User();
            user.setUserId(i);
            user.setUserNickName("");
            user.setUserHead("head");
            user.setUserPassword("1");
            user.setCreateTime(new Date());
            user.setUpdateTime(new Date());
            userDao.insert(user);
        }
        // 测试读写分离
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(UserInfo::getUserId, 2);
        userInfoMapper.selectOne(queryWrapper);
        UserInfo user = new UserInfo();
        user.setUserId(50);
        user.setUserNickName("");
        user.setUserHead("head");
        user.setUserPassword("1");
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        userInfoMapper.insert(user);
    }
}

数据库: 

4.druid监控配置
页面配置
@Configuration
public class DruidConfig {
    @Bean
    ServletRegistrationBean regisDruid() {
        //固定写法,配置访问路径
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        //配置登录信息,固定写法
        HashMap<String, String> initParams = new HashMap<>();
        //账号和密码的key是固定的
        initParams.put("loginUsername", "admin");
        initParams.put("loginPassword", "123456");

        //允许谁可以访问
        initParams.put("allow", "");

        //禁止谁访问 initParams.put("huangcc","192.168.3.12");
        //设置初始化参数
        bean.setInitParameters(initParams);
        return bean;
    }
}
监控配置
        #配置监控统计拦截的filters,去掉后监控界面sql无法统计, 'wall'用于防火墙
        filters: stat
        maxPoolPreparedStatementPerConnectionSize: 20
        useGlobalDataSourceStat: true
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
启动项目

访问监控页http://localhost:8080/druid/index.html 

至此就配置好了 

5.遇到的问题
  • jar版本冲突,一定要注意兼容性
  • 分库分表的键的列在数据库要是主键,否则会失效
  • 配置中的一些自定义属性名最好避免用下划线,'_',可能会出现问题
  • 读写分离和分库分表用的不同的库并且是不同表,注意配置时datasource和sharding是同一级别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于SpringBootShardingSphere实现读写分离的问题。 首先,您需要在pom.xml文件中添加ShardingSphere相关依赖: ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>${sharding-sphere.version}</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding-sphere.version}</version> </dependency> ``` 其中${sharding-sphere.version}为ShardingSphere的版本号。 接下来,您需要在application.yml或application.properties中配置ShardingSphere的数据源和规则,例如: ```yaml spring: shardingsphere: datasource: names: ds_master, ds_slave_0, ds_slave_1 ds_master: url: jdbc:mysql://localhost:3306/mydb_master?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8 username: root password: root ds_slave_0: url: jdbc:mysql://localhost:3306/mydb_slave_0?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8 username: root password: root ds_slave_1: url: jdbc:mysql://localhost:3306/mydb_slave_1?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8 username: root password: root sharding: default-data-source-name: ds_master master-slave-rules: ds_0: master-data-source-name: ds_master slave-data-source-names: ds_slave_0, ds_slave_1 load-balance-algorithm-type: round_robin ``` 以上配置中,我们配置了3个数据源:ds_master, ds_slave_0和ds_slave_1,其中ds_master为主库,ds_slave_0和ds_slave_1为从库。然后我们使用了ShardingSphere提供的master-slave规则将ds_master和ds_slave_0、ds_slave_1进行了关联,并使用了轮询算法进行负载均衡,从而实现读写分离。 最后,您需要在SpringBoot主类上添加@EnableSharding注解,以启用ShardingSphere的功能。 这就是使用SpringBootShardingSphere实现读写分离的基本步骤。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值