springboot~对应sharding-jdbc实现分库分表

打印 上一主题 下一主题

主题 865|帖子 865|积分 2595

原因

当mysql数据库单表大于1千万以后,查询的性能就不能保证了,我们必须考虑分库,分表的方案了,还好,sharding-jdbc可以很优雅的与springboot对接,完成对mysql的分库和分表。
依赖整理

为了不影响其它小容量的表,所有添加了动态数据源,只对需要分库分表的进行配置即可

  • com.baomidou:dynamic-datasource-spring-boot-starter:3.3.1
  • org.apache.shardingsphere:sharding-jdbc-spring-boot-starter:4.1.1
  • com.baomidou:dynamic-datasource-spring-boot-starter:3.3.1
  • com.baomidou:mybatis-plus-boot-starter:3.4.1
  1.     <dependency>
  2.         <groupId>org.apache.shardingsphere</groupId>
  3.         <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  4.     </dependency>
  5.     <dependency>
  6.         <groupId>com.baomidou</groupId>
  7.         <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  8.     </dependency>
  9.     <dependency>
  10.         <groupId>com.alibaba</groupId>
  11.         <artifactId>druid-spring-boot-starter</artifactId>
  12.     </dependency>
  13.     <dependency>
  14.         <groupId>com.baomidou</groupId>
  15.         <artifactId>mybatis-plus-boot-starter</artifactId>
  16.     </dependency>
  17.     <dependency>
  18.         <groupId>mysql</groupId>
  19.         <artifactId>mysql-connector-java</artifactId>
  20.     </dependency>
复制代码
配置整理
  1. spring:
  2.   application.name: sharding-jdbc
  3.   datasource:
  4.     dynamic:
  5.       primary: master0
  6.       datasource:
  7.         master0:
  8.           url: jdbc:mysql://192.168.4.xx:3306/sharding0?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
  9.           username: root
  10.           password: xxx
  11.           driver-class-name: com.mysql.jdbc.Driver
  12.         master1:
  13.           url: jdbc:mysql://192.168.4.xx:3306/sharding1?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
  14.           username: root
  15.           password: xxx
  16.           driver-class-name: com.mysql.jdbc.Driver
  17.   shardingsphere:
  18.     datasource:
  19.       names: ds0,ds1
  20.       ds0:
  21.         driver-class-name: com.mysql.cj.jdbc.Driver
  22.         jdbc-url: jdbc:mysql://192.168.4.xx:3306/sharding0?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
  23.         username: root
  24.         password: xxx
  25.         type: com.zaxxer.hikari.HikariDataSource
  26.       ds1:
  27.         driver-class-name: com.mysql.cj.jdbc.Driver
  28.         jdbc-url: jdbc:mysql://192.168.4.xx:3306/sharding1?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
  29.         username: root
  30.         password: xxx
  31.         type: com.zaxxer.hikari.HikariDataSource #必须个type,否则报错
  32.     sharding:
  33.       tables:
  34.         t_order:
  35.           #key-generator:
  36.           #  column: id
  37.           #  type: SNOWFLAKE
  38.           actual-data-nodes: ds$->{0..1}.t_order_$->{0..1} #需要开发人员手动按规则建立数据表
  39.           database-strategy:
  40.             inline:
  41.               sharding-column: id
  42.               algorithm‐expression: ds$->{id % 2}
  43.           table-strategy:
  44.             inline:
  45.               sharding-column: id
  46.               algorithm‐expression: t_order_$->{id % 2}
  47.     props:
  48.       sql:
  49.         show: true   # 日志显示SQL
  50. mybatis:
  51.   mapperLocations: classpath:mapper/*.xml
  52.   typeAliasesPackage: com.lind.shardingjdbc.entity
  53.   configuration:
  54.     mapUnderscoreToCamelCase: true
复制代码
提前建立表分库和分表


测试代码整理


  • 配置类
  1. @Configuration
  2. @AutoConfigureBefore({ DynamicDataSourceAutoConfiguration.class, SpringBootConfiguration.class })
  3. public class DataSourceConfiguration {
  4.         // 分表数据源名称
  5.         private static final String SHARDING_DATA_SOURCE_NAME = "sharding";
  6.         /**
  7.          * shardingjdbc有四种数据源,需要根据业务注入不同的数据源
  8.          *
  9.          * <p>
  10.          * 1. 未使用分片, 脱敏的名称(默认): shardingDataSource;
  11.          * <p>
  12.          * 2. 主从数据源: masterSlaveDataSource;
  13.          * <p>
  14.          * 3. 脱敏数据源:encryptDataSource;
  15.          * <p>
  16.          * 4. 影子数据源:shadowDataSource
  17.          */
  18.         @Lazy
  19.         @Resource(name = "shardingDataSource")
  20.         AbstractDataSourceAdapter shardingDataSource;
  21.         // 动态数据源配置项
  22.         @Autowired
  23.         private DynamicDataSourceProperties properties;
  24.         @Bean
  25.         public DynamicDataSourceProvider dynamicDataSourceProvider() {
  26.                 Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
  27.                 return new AbstractDataSourceProvider() {
  28.                         @Override
  29.                         public Map<String, DataSource> loadDataSources() {
  30.                                 Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
  31.                                 // 将 shardingjdbc 管理的数据源也交给动态数据源管理
  32.                                 dataSourceMap.put(SHARDING_DATA_SOURCE_NAME, shardingDataSource);
  33.                                 return dataSourceMap;
  34.                         }
  35.                 };
  36.         }
  37.         /**
  38.          * 将动态数据源设置为首选的 当spring存在多个数据源时, 自动注入的是首选的对象 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
  39.          */
  40.         @Primary
  41.         @Bean
  42.         public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
  43.                 DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
  44.                 dataSource.setPrimary(properties.getPrimary());
  45.                 dataSource.setStrict(properties.getStrict());
  46.                 dataSource.setStrategy(properties.getStrategy());
  47.                 dataSource.setProvider(dynamicDataSourceProvider);
  48.                 dataSource.setP6spy(properties.getP6spy());
  49.                 dataSource.setSeata(properties.getSeata());
  50.                 return dataSource;
  51.         }
  52. }
复制代码

  • 实体类和mapper类
  1. @Data
  2. @TableName("t_order")
  3. public class Order {
  4.         @TableId(type = IdType.ASSIGN_ID)
  5.         Long orderId;
  6.         double amount;
  7.         Integer userId;
  8. }
  9. @Mapper
  10. public interface OrderMapper extends BaseMapper<Order> {
  11. }
复制代码

  • 分表的测试
  1.     @GetMapping("insert")
  2.         @DS("sharding")
  3.         public ResponseEntity test() {
  4.                 Order order = new Order();
  5.                 order.setAmount(100);
  6.                 order.setUserId(1);
  7.                 orderMapper.insert(order);
  8.                 return ResponseEntity.ok("success");
  9.         }
复制代码

  • 不进行分表的测试
  1.     @GetMapping("insert-not-sharding")
  2.         public ResponseEntity testNotSharding() {
  3.                 Order order = new Order();
  4.                 order.setAmount(101);
  5.                 order.setUserId(2);
  6.                 orderMapper.insert(order);
  7.                 return ResponseEntity.ok("success");
  8.         }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表