当前位置: 代码网 > it编程>编程语言>Java > SpringBoot3+ShardingJDBC5.5.0 读写分离配置的实现

SpringBoot3+ShardingJDBC5.5.0 读写分离配置的实现

2024年08月09日 Java 我要评论
网上自己找了很多教程但是配合springboot3都无法使用,经过实验发现只有最新版5.5.0支持springboot3x现在把相关读写分离配置分享给大家相关springboot3的包这里就不多赘述,

网上自己找了很多教程但是配合springboot3都无法使用,经过实验发现只有最新版5.5.0支持springboot3x现在把相关读写分离配置分享给大家

相关springboot3的包这里就不多赘述,我使用的是mybatisplus 3.5.5

首先导入相关jar包

         <dependency>
            <groupid>org.apache.shardingsphere</groupid>
            <artifactid>shardingsphere-jdbc</artifactid>
            <version>5.5.0</version>
            <exclusions>
                <exclusion>
                    <groupid>org.apache.shardingsphere</groupid>
                    <artifactid>shardingsphere-test-util</artifactid>
                </exclusion>
            </exclusions>
        </dependency>

这里放一个完整的pom给大家看看

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
         xsi:schemalocation="http://maven.apache.org/pom/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelversion>4.0.0</modelversion>
    <packaging>pom</packaging>
    <groupid>com.yijun.sharding.jdbc</groupid>
    <artifactid>spring-boot3-sharding-jdbc</artifactid>
    <version>0.0.1-snapshot</version>
    <name>spring-boot3-sharding-jdbc</name>
    <description>demo project for spring boot</description>

    <properties>
        <java.version>17</java.version>
        <project.build.sourceencoding>utf-8</project.build.sourceencoding>
        <project.reporting.outputencoding>utf-8</project.reporting.outputencoding>
        <spring-boot.version>3.2.4</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
            <exclusions>
                <exclusion>
                    <groupid>org.springframework.boot</groupid>
                    <artifactid>spring-boot-starter-tomcat</artifactid>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-undertow</artifactid>
        </dependency>
        <dependency>
            <groupid>com.mysql</groupid>
            <artifactid>mysql-connector-j</artifactid>
        </dependency>
        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
            <version>1.18.30</version>
        </dependency>
        <dependency>
            <groupid>org.apache.commons</groupid>
            <artifactid>commons-lang3</artifactid>
            <version>3.13.0</version>
        </dependency>
        <dependency>
            <groupid>jakarta.persistence</groupid>
            <artifactid>jakarta.persistence-api</artifactid>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-aop</artifactid>
        </dependency>
        <dependency>
            <groupid>org.mybatis.spring.boot</groupid>
            <artifactid>mybatis-spring-boot-starter</artifactid>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupid>com.baomidou</groupid>
            <artifactid>mybatis-plus-boot-starter</artifactid>
            <version>3.5.5</version>
            <exclusions>
                <exclusion>
                    <groupid>org.mybatis</groupid>
                    <artifactid>mybatis-spring</artifactid>
                </exclusion>
                <exclusion>
                    <artifactid>mybatis</artifactid>
                    <groupid>org.mybatis</groupid>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupid>org.apache.shardingsphere</groupid>
            <artifactid>shardingsphere-jdbc</artifactid>
            <version>5.5.0</version>
            <exclusions>
                <exclusion>
                    <groupid>org.apache.shardingsphere</groupid>
                    <artifactid>shardingsphere-test-util</artifactid>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencymanagement>
        <dependencies>
            <!-- 对spring-boot版本统一管理-->
            <dependency>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-dependencies</artifactid>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencymanagement>

    <build>
        <plugins>
            <plugin>
                <groupid>org.springframework.boot</groupid>
                <artifactid>spring-boot-maven-plugin</artifactid>
            </plugin>
        </plugins>
    </build>
</project>

第二部对springboot的application进行修改

spring:
  main:
    allow-bean-definition-overriding: true
  application:
    name: ls-backend
  datasource:
    driver-class-name: org.apache.shardingsphere.driver.shardingspheredriver
    url: jdbc:shardingsphere:classpath:sharding.yaml
  servlet:
    multipart:
      max-file-size: 100mb
      max-request-size: 100mb
server:
  port: 8085
  servlet:
    context-path: /
    encoding:
      force-response: true


#mybatis扫描
mybatis:
  config-location: classpath:/mybatis-config.xml

mybatis-plus:
  mapper-locations: classpath:/mapper/*mapper.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.stdoutimp

那么接下来就是重点了,然后是sharding.yaml的相关配置,因为官方的文档比较碎片化,最后进行校验和处理得出的完整文档

datasources:
  ds_1:
    driverclassname: com.mysql.cj.jdbc.driver
    datasourceclassname: com.zaxxer.hikari.hikaridatasource
    jdbcurl: 
    username: 
    password: 
  ds_2:
    driverclassname: com.mysql.cj.jdbc.driver
    datasourceclassname: com.zaxxer.hikari.hikaridatasource
    jdbcurl: 
    username: 
    password: 
rules:
  - !single
    tables:
      - "*.*"
    defaultdatasource: ds_1
  - !readwrite_splitting
    datasources:
      readwrite_ds:
        writedatasourcename: ds_1
        readdatasourcenames:
          - ds_2
        transactionalreadquerystrategy: primary
        loadbalancername: random
    loadbalancers:
      random:
        type: random
props:
  sql-show: true

这里我是用一个读库一个写库处理,数据库连接自己填,打印sql可以开启可以看到读和写走到了不同的库,至于数据分片就不多赘述,我自己也没验证,不过估计在配置文件加入分片规则就可以做到,还有rules的下的配置一定要写single这个 不然它会报找不到表的错误,还有这个配置目前只有shardingjdbc 5.4.1和5.5.0可以用,其他版本并不通用 请不要混用
这里考虑到强制走写库的情况自己根据hintmanager写了一个强制主库的注解和aop如下:

@retention(retentionpolicy.runtime)
@target(elementtype.method)public @interface master {}
@slf4j
@component
@aspect
public class shardingaop {

    @around("execution(* com.yijun..service.impl.*.*(..))")
    public object master(proceedingjoinpoint joinpoint){
        object[] args = joinpoint.getargs();
        object ret = null;
        log.info(joinpoint.toshortstring());
        methodsignature methodsignature = (methodsignature) joinpoint.getsignature();
        method method = methodsignature.getmethod();
        master  master = method.getannotation(master.class);
        hintmanager hintmanager = null;
        try {
            if (objects.nonnull(master)) {
                hintmanager.clear();
                hintmanager = hintmanager.getinstance();
                hintmanager.setwriterouteonly();
            }
            ret = joinpoint.proceed(args);
        }catch (exception ex){
            log.error("exception error",ex);
        }catch (throwable ex2){
            log.error("throwable",ex2);
        }finally {
            if (objects.nonnull(master) && objects.nonnull(hintmanager)) {
                hintmanager.close();
            }
        }
        return ret;
    }
}

设置这个aop后只要在service实现类方法上加上@master注解就可以强制走读库处理了,其他情况安正常处理

到此这篇关于springboot3+shardingjdbc5.5.0 读写分离配置的实现的文章就介绍到这了,更多相关springboot3 读写分离内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com