这个话题也许与 通过 SQL comment 进行强制路由 - Apache ShardingSphere - OpenSEC (sphere-ex.com) 有关.
通过ShardingSphere 5.0.0
的源码, 我注意到这样的Example.
在org.apache.shardingsphere.example.sharding.raw.jdbc.hint.ModuloHintShardingAlgorithm
类 ,它实现了 强制路由 :: ShardingSphere (apache.org) 提到的 org.apache.shardingsphere.sharding.api.sharding.hint.HintShardingAlgorithm
接口.
public final class ModuloHintShardingAlgorithm implements HintShardingAlgorithm<Long> {
@Override
public void init() {
}
@Override
public Collection<String> doSharding(final Collection<String> availableTargetNames, final HintShardingValue<Long> shardingValue) {
Collection<String> result = new LinkedList<>();
for (String each : availableTargetNames) {
for (Long value : shardingValue.getValues()) {
if (each.endsWith(String.valueOf(value % 2))) {
result.add(each);
}
}
}
return result;
}
@Override
public String getType() {
return "HINT_TEST";
}
}
但我感觉这样的应用似乎与CLASS_BASE
( 分片算法 :: ShardingSphere )没有什么区别?而且这个类对应的配置文件,sharding-hint-databases-tables.yaml
中,rules[0].shardingAlgorithms.hint_test
只有type
,没有algorithmClassName
,这也是被允许的做法?
而sharding-hint-databases-only.yaml
存在rules[0].defaultDatabaseStrategy.hint.shardingAlgorithmName
ShardingSphere Doc提到Hint 的主要使用场景之一是分片字段不存在 SQL 和数据库表结构中,而存在于外部业务逻辑。
Example还有一个例子是CLASS_BASE的使用案例,即
org.apache.shardingsphere.example.extension.sharding.algortihm.classbased.fixture.ClassBasedStandardShardingAlgorithmFixture
public final class ClassBasedStandardShardingAlgorithmFixture implements StandardShardingAlgorithm<Integer> {
@Override
public void init() {
}
@Override
public String doSharding(final Collection<String> availableTargetNames, final PreciseShardingValue<Integer> shardingValue) {
for (String each : availableTargetNames) {
if (each.endsWith(String.valueOf(shardingValue.getValue() % 2))) {
return each;
}
}
return null;
}
@Override
public Collection<String> doSharding(final Collection<String> availableTargetNames, final RangeShardingValue<Integer> shardingValue) {
return availableTargetNames;
}
@Override
public String getType() {
return null;
}
}
就给出的例子,我看不出org.apache.shardingsphere.example.extension.sharding.algortihm.classbased.fixture.ClassBasedStandardShardingAlgorithmFixture
和org.apache.shardingsphere.example.sharding.raw.jdbc.hint.ModuloHintShardingAlgorithm
的使用上的区别,希望有朋友能解答我的疑惑.