阿丹:快速搭建快速使用
希望可以快速完成,可粘贴方式的快速搭建
ShardingSphere-JDBC
pom依赖
XML
<!-- ShardingSphere JDBC核心依赖 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>4.1.1</version>
</dependency>
<!-- Myabtis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<!-- spring-web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.4</version>
</dependency>
<!-- 如果你的项目中使用了MySQL数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
application.yml配置文件
XML
spring:
shardingsphere: # Shardingsphere核心配置项
datasource: # 数据源配置
names: ds2024,ds2025
# 定义数据源名称列表,此处只列出2024年和2025年的数据源作为示例
# 配置2024年的数据库数据源
ds2024:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/chicklogin_record_2024?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&autoReconnect=true
username: root
password: lianlu123
ds2025:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/chicklogin_record_2025?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&autoReconnect=true
username: root
password: lianlu123
sharding: # 分片配置
default-database-strategy: # 默认数据库分片策略
standard: # 标准分片策略
sharding-column: ds # 分片依据的字段名(这里假设record_date为年份)
precise-algorithm-class-name: com.XXX.oneclick.config.YearBasedDatabaseShardingAlgorithm # 指定用于分片的数据库策略算法类名
tables: # 表级别的分片配置
chick_record: # 需要分片的逻辑表名
actual-data-nodes: ds$->{2024..2025}.chick_record_$->{0101..1231} # 物理表分布情况,根据年份和日期进行分库分表
table-strategy: # 表级别分片策略
standard: # 标准表分片策略
sharding-column: cdate # 分片依据的字段名(这里假设record_date包含日期信息)
precise-algorithm-class-name: com.XXX.oneclick.config.CustomDateTableShardingAlgorithm # 指定用于精确分片的表策略算法类名 --详细
range-algorithm-class-name: com.XXX.oneclick.config.CustomDateTableRangeShardingAlgorithm #粗略按照天来分
database-strategy:
standard:
sharding-column: cdate # 分片依据的字段名(这里假设record_date为年份)
precise-algorithm-class-name: com.XXX.oneclick.config.YearBasedDatabaseShardingAlgorithm
key-generator: # 主键生成策略
type: SNOWFLAKE # 使用Snowflake算法作为主键生成器
column: id # 主键列名
分表分库实现类:
在Apache ShardingSphere(包括Sharding-JDBC和Sharding-Proxy)中,RangeTableShardingAlgorithm
和 PreciseShardingAlgorithm
是两种不同的分片算法接口,它们分别用于处理不同的分片场景。
-
PreciseShardingAlgorithm:
- 该算法用于处理精确分片场景,即当SQL查询条件能够明确确定目标数据所在的分片时。例如,根据用户ID分表,查询时根据某个具体的用户ID决定数据应落在哪一张子表上。实现此类接口时,需要提供一个方法,它接受一个精确值并返回对应的数据库表名。
-
RangeTableShardingAlgorithm:
- 此算法用于处理范围分片场景,即当SQL查询条件是一个范围时,需要确定哪些分片可能包含符合条件的数据。例如,根据订单时间在一个时间区间内的订单记录分布于多张表中,此时就需要根据时间范围来决定哪些表会被涉及。实现此类接口时,方法需要接收一个范围值,并返回可能包含匹配数据的所有数据库表名。
总结来说,PreciseShardingAlgorithm
处理单个精确值的分片,而RangeTableShardingAlgorithm
处理连续区间值的分片。在实际使用时,根据业务场景和分片策略的需求选择合适的分片算法来实现。在您给出的配置中,CustomDateTableShardingAlgorithm
是用来实现表级别的精确分片,而如果是根据时间范围查询,则可能需要实现RangeTableShardingAlgorithm
来处理这种类型的查询。
粗略分按照天
分表策略:
java
package com.XXXX.oneclick.config;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.*;
/**
* 粗略分按照天
*/
@Configuration
public class CustomDateTableRangeShardingAlgorithm implements RangeShardingAlgorithm<Date> {
public CustomDateTableRangeShardingAlgorithm() {
}
@Override
// @Bean
public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Date> shardingValue) {
List<String> result = new ArrayList<>();
// 根据rangeShardingValue.getValueRange()获取范围内的起始和结束日期
Date startDate = shardingValue.getValueRange().lowerEndpoint();
Date endDate = shardingValue.getValueRange().upperEndpoint();
// 将范围内的每个日期转换为相应的表名并加入结果集
while (!startDate.after(endDate)) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
// 修正月份和日期的获取方式
String month = String.format("%02d", calendar.get(Calendar.MONTH) + 1); // 注意月份需要+1,因为Java的月份是从0开始的
String day = String.format("%02d", calendar.get(Calendar.DAY_OF_MONTH));
String monthDay = month + day;
result.add("chick_record_" + monthDay);
// 更新startDate以便进入下一个日期
calendar.add(Calendar.DATE, 1);
startDate = calendar.getTime();
}
return result;
}
}
java
package com.lianlu.oneclick.config;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
/**
* 按照天分表--详细分篇
*
*/
// CustomDateTableShardingAlgorithm.java
@Configuration
public class CustomDateTableShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
public CustomDateTableShardingAlgorithm() {
}
@Override
// @Bean
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {
// 根据record_date字段提取年月日,并将其转换为相应的表名
Calendar calendar = Calendar.getInstance();
calendar.setTime(shardingValue.getValue());
// 月份加1是因为Java的Calendar月份是从0开始的,而我们想要的是1-12的格式
String month = String.format("%02d", calendar.get(Calendar.MONTH) + 1);
String day = String.format("%02d", calendar.get(Calendar.DAY_OF_MONTH));
String monthDay = month + day;
return "chick_record_" + monthDay;
}
}
分库策略:
java
package com.XXXX.oneclick.config;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
/**
* 数据库配置
* 按照年分库
*/
// YearBasedDatabaseShardingAlgorithm.java
@Configuration
public class YearBasedDatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {
// 直接从shardingValue.getValue()中获取年份
Calendar calendar = Calendar.getInstance();
calendar.setTime(shardingValue.getValue());
int year = calendar.get(Calendar.YEAR);
return "ds" + year;
}
}
mybaits:
多数据源:
单数据源:
mapper模板
XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>