Sharding-JDBC标准模式详解
一. 为什么要使用标准模式?
Sharding-JDBC的标准模式就配置而言比inline模式繁琐多了, 那为什么要使用标准模式呢
Sharding-JDBC作为Apache ShardingSphere生态中的一款轻量级Java框架,提供了数据分片、读写分离、分布式事务和数据库治理等核心功能。在Sharding-JDBC中,标准模式和inline模式是两种不同的配置方式,它们各有特点。关于Sharding-JDBC标准模式比inline模式好的方面,可以从以下几个维度进行分析:
一、配置复杂性与灵活性
- 标准模式:通常提供更丰富、更灵活的配置选项。它支持复杂的分片策略、多种数据源配置以及细粒度的控制。标准模式允许开发者根据业务需求进行详细的定制,包括分片键的选择、分片算法的实现以及数据源的管理等。
- inline模式:通过Groovy表达式简化分片规则的配置,使得分片策略的配置更加简洁、直观。然而,这种简洁性也带来了一定的局限性,即它可能不支持某些复杂的分片策略或需要额外的配置来实现某些功能。
二、性能与扩展性
- 标准模式:由于提供了更全面的配置选项和更灵活的分片策略,标准模式在性能优化和扩展性方面通常具有更大的潜力。开发者可以根据实际需求对分片策略进行微调,以充分利用数据库的计算和存储能力。
- inline模式:虽然配置简单,但在处理大规模数据或复杂查询时,其性能可能受到一定限制。此外,由于inline模式的分片策略是预定义的,因此在面对业务变化时可能需要更多的调整工作。
三、可读性与维护性
- 标准模式:配置文件通常较为详细和复杂,这在一定程度上增加了可读性和维护性的难度。然而,通过合理的组织和管理配置文件,以及使用版本控制系统等工具,可以有效地降低这种难度。
- inline模式:配置简洁明了,易于理解和维护。然而,对于不熟悉Groovy表达式或Sharding-JDBC的开发者来说,可能需要一定的学习成本来理解和修改配置。
四、适用场景
- 标准模式:适用于需要高度定制化和灵活性的场景,如大型分布式系统、复杂业务逻辑等。在这些场景中,开发者需要充分利用Sharding-JDBC提供的各种功能来优化性能和扩展性。
- inline模式:适用于分片规则较为简单且固定的场景,如小型应用、测试环境等。在这些场景中,开发者更注重配置的简洁性和易用性,而不太关注复杂的分片策略或性能优化。
综上所述,Sharding-JDBC标准模式相比inline模式在配置复杂性与灵活性、性能与扩展性方面更具优势。然而,在选择使用哪种模式时,还需要根据具体的业务需求和场景进行权衡。如果业务逻辑相对简单且固定,inline模式可能是一个更好的选择;而如果业务逻辑复杂且需要高度定制化,则标准模式可能更适合。
二. 如何使用?
sharding-JDbc的配置无非分为一下几步
# 1. 配置数据源
# 2. 配置逻辑表数据节点
# 3. 配置分库策略
# 4. 配置分表策略
# 5. 其他配置完善
1. 配置数据源
# 数据源名称,多数据源以逗号分隔
spring.shardingsphere.datasource.names=ds1,ds2
# 数据库连接池类名称
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
# 数据库驱动类名
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库 url 连接
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://192.168.188.130:3306/order_db_1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
# 数据库用户名
spring.shardingsphere.datasource.ds1.username=root
# 数据库密码
spring.shardingsphere.datasource.ds1.password=root
# 数据库连接池类名称
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
# 数据库驱动类名
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库 url 连接
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://192.168.188.130:3306/order_db_2?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=Asia/Shanghai
# 数据库用户名
spring.shardingsphere.datasource.ds2.username=root
# 数据库密码
spring.shardingsphere.datasource.ds2.password=root
2. 配置逻辑表数据节点
# 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{1..2}.t_order_$->{1..2}
3. 配置分库策略
在标准模式下的分库分表配置会相对麻烦
#分片列名称
spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.sharding-column=
#精确分片算法类名称,用于=和IN。该类需实现PreciseShardingAlgorithm接口并提供无参数的构造器
spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.precise-algorithm-class-name=
#范围分片算法类名称,用于BETWEEN,可选。该类需实现RangeShardingAlgorithm接口并提供无参数的构造器
spring.shardingsphere.sharding.tables.<logic-table-name>.database-strategy.standard.range-algorithm-class-name=
实现接口
package com.jixu.stock.sharding;
import com.google.common.collect.Range;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;
import org.joda.time.DateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* @program: stock_parent
* @description:
* @author: jixu
* @create: 2024-10-15 22:37
**/
public class Alg4DB implements PreciseShardingAlgorithm<Date> , RangeShardingAlgorithm<Date> {
// 配置
@Override
public String doSharding(Collection<String> collection, PreciseShardingValue<Date> preciseShardingValue) {
// getValue --> 获取sql语句中的查询条件
Date value = preciseShardingValue.getValue();
// getColumnName --> 获取判断的列名
String columnName = preciseShardingValue.getColumnName();
// getLogicTableName --> 获取逻辑表名
String logicTableName = preciseShardingValue.getLogicTableName();
// 获取当前年份
String year = new DateTime(value).getYear() + "";
// 设置过滤条件
Optional<String> msg = collection.stream().filter(item -> item.endsWith(year)).findFirst();
if (msg.isPresent()){
return msg.get();
}
return "";
}
@Override
public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Date> rangeShardingValue) {
Range<Date> valueRange = rangeShardingValue.getValueRange();
if (valueRange.hasLowerBound()){
Date date = valueRange.lowerEndpoint();
int startYear = new DateTime(date).getYear();
collection = collection.stream().filter(item -> Integer.valueOf(item.substring(item.lastIndexOf("-") + 1)) >= startYear).collect(Collectors.toList());
}
if (valueRange.hasUpperBound()){
Date date = valueRange.upperEndpoint();
int endYear = new DateTime(date).getYear();
collection = collection.stream().filter(item -> Integer.valueOf(item.substring(item.lastIndexOf("-") + 1)) <= endYear).collect(Collectors.toList());
}
return collection;
}
}
4. 配置分表策略
spring.shardingsphere.sharding.tables.stock_rt_info.table-strategy.standard.sharding-column= cur_time
spring.shardingsphere.sharding.tables.stock_rt_info.table-strategy.standard.precise-algorithm-class-name=${common.sharding4db}
spring.shardingsphere.sharding.tables.stock_rt_info.table-strategy.standard.range-algorithm-class-name=${common.sharding4db}
5. 其他配置
# 5. 其他配置
# 5.1 配置默认数据源
spring.shardingsphere.sharding.default-data-source-name=defultdb
# 5.2 配置显示sql
spring.shardingsphere.props.sql.show=true
# 5.3 配置广播表
spring.shardingsphere.sharding.broadcast-tables=stock_business
标签:JDBC,shardingsphere,配置,模式,sharding,详解,spring,Sharding,分片
From: https://blog.csdn.net/xiugtt6141121/article/details/142987972