如题。
现在有个任务,一张大表数据上亿,需要按照月份拆分。用shardingJDBC的技术进行分表。
这个是log数据,而且会一直增加,
也就是说,即使现在你创建了2018年12个月,2019年12个月,等到2020年一月份怎么办?
难道要一开始创建好几年的表,然后等过了这些年,再手动创建新表然后上代码改配置吗?
全网没有搜到解决方案,
到看到一个跟我一样诉求的帖子:if shardingsphere can create tables automatically? #2521 里面并没有解决办法
还有一个说是没法动态创建表:Sharding-JDBC的动态分表
但好像都没明确说明为什么不能动态分表,大概看了一下分表规则核心代码:
分表设置需要在TableRule上设置具体分表有那几个表:actualTables(tnames)
那我是不是可以在分片的时候,假如我按照goods_id%4分片,我现在已经在数据库里创建了goods_0,goods_1两张表,当goods_id%4==2或者3的时候,用JDBC创建表,然后让shardingJDBC知道我新建了一个表,分片规则里的表就多一个,不就好了嘛。
【我分析认为:
一旦创建了DataSource,就分配了分表规则,已经写死在里面了,
新建一个表,表名是不是得重新写一个分表规则,新建一个buildDataSource()?
这些都没用吧?因为人家shardingJDBC就认你一开始制定的规则,后面加的不认识。。】
如果有大佬实现了这个功能,求告诉我。。。。
现在来看看我是怎么掉坑里的,想把问题抛出来,看看有没有解决办法,
没有的话,那就只能手动建个20年的表(不知道会不会被打死)
现在来看看我的demo怎么实现的:
架构用的是springboot + Maven + JPA + MySQL +sharding-jbdc,
感兴趣的同学可以自己按照我的目录重新构建项目,代码我不放github了。
这个demo除了动态建表分表,没有成功之外, (不需要这部分代码可以自己去掉,等下告诉你删哪些代码)
它很好的实现了:(分库的部分我注释掉了,感兴趣的可以自己完善它,网上也有相关代码)
1. 按id奇偶分表;
2. 分布式自增主键;
3. 测试分表save,update,select,delete;
4. 测试查询跨表数据;
5. 测试查询指定id list数据;
6. 用java创建MySQL 数据表;
目录是: (我把无关的目录划掉了)
pom.xml :
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.ziqiiii</groupId>
<artifactId>sharding-jdbc-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sharding-jdbc-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<!-- sharding-jdbc -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>