sharding string 和 long 处理

This commit is contained in:
wangw 2025-01-06 17:46:55 +08:00
parent e61e3bb520
commit 63fca8e8df
1 changed files with 15 additions and 35 deletions

View File

@ -2,50 +2,30 @@ package com.sqx.sharding;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import java.util.Collection;
// 自定义包装类实现Comparable接口
class ShardingValueWrapper implements Comparable<ShardingValueWrapper> {
private Object value;
public ShardingValueWrapper(Object value) {
this.value = value;
}
public Object getValue() {
return value;
}
public class StandardShardingStrategyConf implements PreciseShardingAlgorithm<String> {
@Override
public int compareTo(ShardingValueWrapper other) {
// 这里简单比较两个包装类内部持有的对象的toString结果实际可能需要更合理的比较逻辑
return this.value.toString().compareTo(other.value.toString());
}
}
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
Object valueObj = shardingValue.getValue();
long value = 0;
if (valueObj instanceof String) {
// 如果是字符串类型尝试解析为Long
value = Long.parseLong((String) valueObj);
public class StandardShardingStrategyConf implements PreciseShardingAlgorithm<ShardingValueWrapper> {
} else if (valueObj instanceof Long) {
// 如果是字符串类型尝试解析为Long
value = (long) valueObj;
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<ShardingValueWrapper> shardingValue) {
ShardingValueWrapper wrapper = shardingValue.getValue();
Object valueObj = wrapper.getValue();
Long valueLong;
try {
if (valueObj instanceof Long) {
valueLong = (Long) valueObj;
} else {
valueLong = Long.parseLong(valueObj.toString());
}
} catch (NumberFormatException e) {
throw new IllegalArgumentException("无法将传入的分片值转换为Long类型", e);
}
long tableIndex = valueLong % 5;
// 根据ID对5取模来确定表名
long tableIndex = value % 5;
for (String tableName : availableTargetNames) {
if (tableName.endsWith(String.valueOf(tableIndex))) {
return tableName;
}
}
throw new IllegalArgumentException("没有找到匹配的表名");
throw new IllegalArgumentException();
}
}
}