package com.gxx.sharding.base; import java.util.Collection; import java.util.LinkedHashSet; import org.apache.log4j.Logger; import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlgorithm; import com.google.common.collect.Range; /** * 用户单字段分库算法 * @author Gxx */ public class UserSingleKeyDatabaseShardingAlgorithm implements SingleKeyDatabaseShardingAlgorithm { /** * 日志处理器 */ private Logger logger = Logger.getLogger(UserSingleKeyDatabaseShardingAlgorithm.class); /** * sql equal 规则 * sharding_00.user_0 * sharding_00.user_1 * sharding_01.user_0 * sharding_01.user_1 */ @Override public String doEqualSharding(Collection availableDatabaseNames, ShardingValue shardingValue) { logger.info("用户单字段分库算法:sql equal 规则"); logger.info("sharding value:" + shardingValue.getValue()); for (String each : availableDatabaseNames) { if (each.endsWith(shardingValue.getValue() % 4 / 2 + "")) { logger.info("扫描到库:" + each); return each; } } logger.info("没有扫描到任何库"); throw new IllegalArgumentException(); } /** * sql in 规则 */ @Override public Collection doInSharding(Collection availableDatabaseNames, ShardingValue shardingValue) { logger.info("用户单字段分库算法:sql in 规则"); logger.info("sharding values:" + shardingValue.getValues()); Collection result = new LinkedHashSet(availableDatabaseNames.size()); for (Long value : shardingValue.getValues()) { logger.info("sharding value:" + value); for (String each : availableDatabaseNames) { if (each.endsWith(value % 4 / 2 + "")) { logger.info("扫描到库:" + each); result.add(each); } } } logger.info("扫描最终结果:" + result); return result; } /** * sql between and 规则 */ @Override public Collection doBetweenSharding(Collection availableDatabaseNames, ShardingValue shardingValue) { logger.info("用户单字段分库算法:sql between and 规则"); logger.info("sharding value range:" + shardingValue.getValueRange()); Collection result = new LinkedHashSet(availableDatabaseNames.size()); Range range = (Range) shardingValue.getValueRange(); for (Long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) { logger.info("sharding value:" + i); for (String each : availableDatabaseNames) { if (each.endsWith(i % 4 / 2 + "")) { logger.info("扫描到库:" + each); result.add(each); } } } logger.info("扫描最终结果:" + result); return result; } }