springboot整合ShardingSphere-JDBC

本文介绍了Sharding-JDBC,它是一款可实现分库分表和读写分离的轻量级Java框架,在JDBC层提供额外服务。其以jar包形式提供服务,兼容JDBC和多种ORM框架,但不支持Druid连接池。还说明了引入方式及使用时在连接池和SQL事务方面的注意事项。

概念:

sharding-JDBC是一款分库分表可以实现读写分离的轻量级Java框架,在Java的JDBC 层提供的额外服务。

工作方式:

它使用客户端直连数据库,以jar 包形式提供服知,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM
框架。

•适用于任何基于 JDBC 的ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或
直接使用 JDBC;
•支持任何第三方的数据库连接池,如:DBCP C3PO, BoneCP HikaricP 等;
但是它不支持Druid(德鲁伊)数据库连接池

引入方式:

第一步导入pom文件

   <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.1.1</version>
        </dependency>

第二步配置application.yml文件

# 读写分离配置
spring:
  shardingsphere:
    datasource:
      # 配置真实数据源
      names: master,slave1,slave2
      # 配置第 1 个数据源
      master:
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/master
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        username: root
      # 配置第 2 个数据源
      slave1:
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/slave
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        username: root
      # 配置第 3 个数据源
      slave2:
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/slave
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        username: root
    mode:
      # 内存模式
      type: Memory
    # 打印sql
    props:
      sql-show: true
    rules:
      readwrite-splitting:
        data-sources:
          myds:
            # 读数据源负载均衡算法名称
            load-balancer-name: alg_round
            props:
              # 读数据源名称,多个从数据源用逗号分隔
              read-data-source-names: slave1,slave2
              # 写数据源名称
              write-data-source-name: master
            # 读写分离类型,如: Static,Dynamic
            type: Static
        load-balancers:
          # 定义负载均衡算法:随机,轮询,权重
          alg_random:
            type: RANDOM
          alg_round:
            type: ROUND_ROBIN
          alg_weight:
            props:
              slave1: 1
              slave2: 2
            type: WEIGHT

注意事项

1.但是它不支持Druid(德鲁伊)数据库连接池
2.sql事务有关的内容需要慎重考虑(可以考虑使用@Transactional注解进行开发)

### Spring Boot 集成 ShardingSphere-JDBC 示例教程 #### 1. 引入依赖 在 `pom.xml` 文件中添加 ShardingSphere-JDBC 的 Maven 依赖。以下是一个示例配置[^3]: ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>5.1.1</version> </dependency> ``` 确保引入的版本与项目兼容,并根据实际需求选择合适的版本。 --- #### 2. 配置数据源 在 `application.yml` 中配置数据源和分片规则。以下是一个简单的分片配置示例[^3]: ```yaml spring: shardingsphere: datasource: names: ds0,ds1 ds0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db0?serverTimezone=UTC&useSSL=false username: root password: root ds1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db1?serverTimezone=UTC&useSSL=false username: root password: root rules: sharding: tables: t_order: actual-data-nodes: ds$->{0..1}.t_order_$->{0..1} table-strategy: standard: sharding-column: order_id sharding-algorithm-name: t_order_inline key-generate-strategy: column: order_id key-generator-name: snowflake sharding-algorithms: t_order_inline: type: INLINE props: algorithm-expression: t_order_$->{order_id % 2} key-generators: snowflake: type: SNOWFLAKE props: worker-id: 123 ``` 上述配置中,定义了两个数据源 `ds0` 和 `ds1`,并将表 `t_order` 按照 `order_id` 的奇偶性进行分片。 --- #### 3. 启动类配置 在 Spring Boot 的启动类上添加 `@MapperScan` 注解以扫描 MyBatis 的 Mapper 接口。以下是一个示例[^1]: ```java package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` --- #### 4. 测试读写分离功能 通过编写单元测试验证读写分离功能是否正常工作。以下是一个简单的测试代码[^2]: ```java import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import lombok.extern.slf4j.Slf4j; import java.util.List; @SpringBootTest @Slf4j public class ShardingSphereTest { @Autowired private UserService userService; @Test public void testRead() { List<User> users = userService.list(); log.info("查询结果为:{}", users); } @Test public void testWrite() { User user = new User(); user.setName("TestUser"); user.setAge(25); userService.save(user); log.info("插入用户成功:{}", user); } } ``` --- #### 5. 注意事项 - **分片算法**:ShardingSphere 提供多种内置分片算法(如 `INLINE`, `MOD`),也可以自定义分片策略[^3]。 - **数据一致性**:在分布式环境下,需特别关注数据一致性问题,例如主键生成策略、事务管理等。 - **监控与日志**:可以通过配置日志或使用 ShardingSphere 的监控工具来跟踪 SQL 执行情况。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值