ShardingJdbc一览
发布日期:2021-05-06 19:58:53 浏览次数:18 分类:技术文章

本文共 3111 字,大约阅读时间需要 10 分钟。

ShardingJdbc一览


更多shardingJdbc内容可以参考官方文档:。关于其他的中间件可以参考之前写的文章:

介绍

ShardingJdbc通过在Java的JDBC层提供额外服务的方式达到分库分表的目的,是Client模式的一个分库分表中间件,据其官网描述,可以完全兼容JDBC和各种ORM框架。

在这里插入图片描述

使用

demo是基于Springboot+MyBatisPlus+MySQL进行实现,采用的是水平分表的形式。这里只给了如下几个依赖:

com.alibaba
druid-spring-boot-starter
1.1.21
mysql
mysql-connector-java
8.0.12
org.apache.shardingsphere
sharding-jdbc-spring-boot-starter
4.0.0-RC1
com.baomidou
mybatis-plus-boot-starter
3.3.1
  1. 这里需要事先创建了course_1course_2两张表。
CREATE TABLE `course_1` (  `id` bigint NOT NULL,  `course_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,  `create_time` timestamp NULL DEFAULT NULL,  `creator` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,  PRIMARY KEY (`id`),) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  1. 实体类如下:
public class Course {
private Long id; private String courseName; private Date createTime; private String creator; }
  1. Mapper类配置:
@Repositorypublic interface CourseMapper extends BaseMapper
{
}
  1. 具体的ShardingJdbc配置
spring:  application:    name: sharding-jdbc-demo  main:    # 允许覆盖重复的bean,默认情况下,单个配置文件中存在id或者name相同的bean定义,spring解析时会报错    allow-bean-definition-overriding: true  shardingsphere:    datasource:      # m1名称可以自己起, 多个数据源的时候需要配置多个名称,即names: m1,m2,m3...      names: m1      m1:        # 指定连接池, 连接驱动        type: com.alibaba.druid.pool.DruidDataSource        driver-class-name: com.mysql.cj.jdbc.Driver        # 这是我的MySQL 8版本的连接地址        url: jdbc:mysql://127.0.0.1:3306/fsn?serverTimezone=GMT%2B8&useSSL=false        username: ali        password: dpp10078    sharding:      tables:        test:          # 我这里只对course分了两张表          actual-data-nodes: m1.course_$->{
1..2} # 指定主键生成策略 key-generate-strategy: # 指定主键列 column: id # 指定生成主键的算法 key-generator-name: SNOWFLAKE table-strategy: inline: # 指定用于分表(分片)的列 sharding-column: id # 具体策略是根据奇偶性插入不同表 algorithm-expression: test_$->{
id % 2 + 1} props: sql: # 为true时, 可以把运行时的sql打印出来 show: true

踩到的坑

  1. java.lang.String.mod() is applicable for argument types: (java.lang.Integer) values: [2]

这里和我一开始设置的主键id类型有关,一开始设置为varchar,实体里也是String类型,但我id又是分片规则指定的列且运算规则如下algorithm-expression: test_$->{id % 2 + 1},此时则id是为Integer类型的,所以报了一个将Integer类型的值设置都String类型的变量上去的错误。

  1. 第二个是报了一个allowBeanDefinitionOverriding相关的异常,并提示如下信息:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

按提示,增加:

allow-bean-definition-overriding: true

这其实因为ShardingJdbc分了表,但对应的实体都是Course,而默认情况下,经由Spring管理时,由于创建出的Bean的名称相同(此条件下不会覆盖),解析报错。

运行流程(待补)

上一篇:【跳跃表篇】Redis为什么快?你能回答出几个点呢?
下一篇:Dubbo协议一览

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年03月21日 03时43分42秒