ShardingSphere 之 Sharding-JDBC 数据分片实践

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。

简介

ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Shardingmybatis面试题-Jmybatis怎么读DBC、Sharding-Proxy 和 Sharding-Sidecar(计划中)这3款相互独立的实体类组成。 他们均mybatis批量更新提供标准化的数据分片、springcloudalibaba分布式事务和数据库治理功能,可适用于如Java同构产品经理、异构语言、云原生等各种多样化的应用场springcloud面试题景。

ShardingSphere 定位为httpclient关系型数据产品密钥库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而http 404并非实现一个全新的关系型Spring+Cloud数据库。 它与 NoSQL 和 NewSQL 是并存而非互斥的关系。NoSQL 和 NewSQL 作为新技术探索的前沿,放眼未来,拥https和http的区别抱变化,是非常值得推荐的。反之,也可以用另一种思路看待springcloud项目搭建问题,放眼未来,关注不变的东西,进而抓住事物本质。 关系型数据库当今产品营销策略依然占有巨大市场,是各个公司核心业务的基石,未来也mybatis面试题难于撼动,我们目产品质量法前阶段更加关注在原有基础上的增量,而非颠覆http协议

ShardingSphere 已经在2020年4月16日从Apache孵化器毕业,成为 Ahttp://www.baidu.compaspringcloud注册中心che 顶级项目。

快速入门

创建表

这里需要注意mybatis动态sql的是字段不要https和http的区别有关键字http://www.baidu.com子类的,尽量长一点。

create database `cloud-order`;
use `cloud-order`;
create database if not exists `cloud-order` default charset utf8mb4 collate utf8mb4_general_ci;
create table t_order_1 (
  `oid` bigint(20) unsigned not null auto_increment comment '主键id',
  `order_code` varchar(64) not null default '' comment '订单号',
  primary key (`oid`),
  key `idx_order_code` (`order_code`)
) comment '订单表';
create table t_order_2 (
  `oid` bigint(20) unsigned not null auto_increment comment '主键id',
  `order_code` varchar(64) not null default '' comment '订单号',
  primary key (`oid`),
  key `idx_order_code` (`order_code`)
)comment '订单表';

添加依赖

我说下项目的基本情况:

  • springMyBatis boot 2.6.5
  • springmybatis缓存 cloud 2021.0.1
  • mybatis-spring-boot-starter 2.2.2
  • sharding-jmybatis工作原理产品设计dbc-sprin产品g-boot-starter 4.1.1

目前来说mybatis一级缓存和二级缓存都是产品经理比较新的版本,所以肯定会踩很多的坑。具体的配置如下(由于我的配置是之前的项目修http协议改,不够简洁大家凑合看吧):

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.6.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group 'io.zhengsh'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
    mavenLocal()
    maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
    mavenCentral()
}
ext {
    set('springCloudVersion', "2021.0.1")
}
configurations {
    compile.exclude module: 'spring-boot-starter-tomcat'
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-undertow'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
    implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'
    // mysql
    implementation 'mysql:mysql-connector-java'
    // mybatis
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
    // shardingsphere
    implementation 'org.apache.shardingsphere:sharding-jdbc-spring-boot-starter:4.1.1'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compileOnly 'org.projectlombok:lombok:1.18.22'
    annotationProcessor 'org.projectlombok:lombok:1.18.22'
    testCompileOnly 'org.projectlombok:lombok:1.18.22'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
}
dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}
tasks.named('test') {
    useJUnitPlatform()
}

添加 YML 配置

添加 YML 配置,主要是有一下配https和http的区别

  • 设置数据源spspringcloud五大组件ringcloud从入门到精通,就是配置有哪些产品设计专业
  • 设置数据表,参http 302与分片的表
  • 设置分表的产品介绍策略,我这边使用的是雪花算法生成 id , 并且通过取模的方式指定数据位置。
spring:
  shardingsphere:
    # 设置数据源
    datasource:
      names: o1
      o1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://127.0.0.1:3306/cloud-order?useUnicode=true&zeroDateTimeBehavior=convertToNull&useSSL=false
        username: root
        password: root123
    props:
      # 打印 sql 
      sql.show: true
    sharding:
      default-data-source-name: o1
      tables:
        t_order:
          # 指定需要分的表
          # 表达式, 实际数据节点: 根据上一个节点找到此值, {0..1}为groovy语言,$会替换成{0..1}的一个值,数据库表是: t_order_1 , t_order_2
          # 这个配置是告诉sharding有多少个表
          actual-data-nodes: o1.t_order_$->{1..2}
          key-generator:
            # 指定主键
            column: oid
						# 生成方式: 雪花算法
            type: snowflake
            props:
              worker:
                id: 1
          # 分表策略
          table-strategy:
            inline:
							# 配置sharding的计算列
              sharding-column: oid
              # 配置sharding的表达式,对应的id必须和sharding-column的值对应,否则报错
              algorithm-expression: t_order_$->{oid % 2 + 1}

Java 代码

1、实体类

public class OrderEntity {
    private Long oid;
    private String orderCode;
    // 此处省略 get、set 方法
}

2、Mapper 文件

@Mapper
public interface OrderEntityMapper {
    @Insert("insert into o1.t_order (`order_code`) values(#{orderCode})")
    @Options(useGeneratedKeys = true, keyProperty = "oid", keyColumn = "oid")
    int insertSelective(OrderEntity record);
    @Select("select * from o1.t_order where oid = #{oid}")
    OrderEntity selectOne(@Param("oid") Long oid);
}

3、 单元mybatis面试题测试

@Test
public void insertOrder() {
  for (int i = 0; i < 10; i++) {
    OrderEntity order = new OrderEntity();
    order.setOrderCode("OR000" + i);
    int row = orderEntityMapper.insertSelective(order);
    Assert.assertTrue(row > 0);
  }
}
@Test
public void selectOne() {
  OrderEntity order1 = orderEntityMapper.selectOne(
715721929377452033L);
  Assert.assertNotNull(order1);
}

执行结果

1、插入数据

ShardingSphere 之 Sharding-JDBC 数据分片实践
2、查询结果

ShardingSphere 之 Sharding-JDBC 数据分片实践

常见问题

健康检测出错

核心就是 yml 配置。我之前遇到一个问题就是健康检测出错,无法配置,所以采用 Jhttps和http的区别ava config 方式的配springcloud项目搭建置来规避这个启动报错

添加 Java config 配置如下所示:

@Configuration
public class DataSourceConfig {
    @Bean
    public HealthIndicator dbHealthIndicator(DataSource dataSource) {
        DataSourceHealthIndicator indicator = new DataSourceHealthIndicator(dataSource);
        indicator.setQuery("select 1");
        return indicator;
    }
}

空指针异常

MyBat产品营销策略is 查询时,报错了,报了一个空指针。查询别的表的时候不报错,就这个表springcloud注册中心报错,如下所示:

### Cause: java.lang.NullPointerException
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426)
	... 75 common frames omitted
Caused by: java.lang.NullPointerException: null
	at org.antlr.v4.runtime.tree.AbstractParseTreeVisitor.visit(AbstractParseTreeVisitor.java:18)
	at org.apache.shardingsphere.sql.parser.mysql.visitor.impl.MySQLDMLVisitor.createProjection(MySQLDMLVisitor.java:446)
// 省略部分异常  

最开始以为mybatis中$和井号区别是分表的原因,后来查了网上的资料springcloudalibaba,是表里面有关键字导致的。查看异常信息时,mybatis面试题忽略了最上面的提示:

line 1:176 mismatched input 'order' expecting {..... 忽略一些关键字}

invoke method mod(springcloud项目搭建) on null objec实体类的定义t 异常

后面我又遇到了这个问题 Cannot invspringcloud负载均衡oke method mod() on null object] wihttpspringcloud面试题 404th root cause 异常,产品生命周期完整HTTP的错springcloud从入门到精通误信息产品经理如下httpwatch

### SQL: insert into o1.t_order (`order_code`, `code`) values(?, ?)
### Cause: java.lang.NullPointerException: Cannot invoke method mod() on null object
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
	at com.sun.proxy.$Proxy112.insert(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
// 省略部分异常

产品营销策略题原因:分片键和分片策略中的字段不一致导致

ShardingSphere 之 Sharding-JDBC 数据分片实践

发表评论

提供最优质的资源集合

立即查看 了解详情