shardingJDBC按月分表,能否实现动态创建表,然后进行分表?

本文讨论了使用ShardingJDBC进行按月动态分表的需求。面对数据量上亿的大表,作者考虑通过ShardingJDBC进行分表,但遇到疑问:如何在新的月份到来时自动创建新表并更新配置。目前网上资料表明ShardingJDBC似乎不支持动态创建表。作者分析可能是因为分表规则在初始化时已固定。文中分享了作者的尝试和SpringBoot+Maven+JPA+MySQL+sharding-jdbc的项目架构,实现了按ID奇偶分表、分布式自增主键等功能,但动态建表分表未能成功。作者期待找到解决方案,以免手动创建多年份的表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题。

现在有个任务,一张大表数据上亿,需要按照月份拆分。用shardingJDBC的技术进行分表。

这个是log数据,而且会一直增加,

也就是说,即使现在你创建了2018年12个月,2019年12个月,等到2020年一月份怎么办?

难道要一开始创建好几年的表,然后等过了这些年,再手动创建新表然后上代码改配置吗?

全网没有搜到解决方案,

到看到一个跟我一样诉求的帖子:if shardingsphere can create tables automatically? #2521 里面并没有解决办法

还有一个说是没法动态创建表:Sharding-JDBC的动态分表

 

但好像都没明确说明为什么不能动态分表,大概看了一下分表规则核心代码:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

分表设置需要在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 数据表;

 

目录是: (我把无关的目录划掉了)

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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>
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值