sharding string 和 long 处理
This commit is contained in:
parent
e61e3bb520
commit
63fca8e8df
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue