load-balance-algorithm-type: round_robin
load-balance-algorithm-type: random
# 算法接口
io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithm
# random 实现类
RandomMasterSlaveLoadBalanceAlgorithm
# round_robin 实现类
RoundRobinMasterSlaveLoadBalanceAlgorithm
MasterSlaveLoadBalanceAlgorithmType
# 默认是ROUND_ROBIN
public enum MasterSlaveLoadBalanceAlgorithmType {
ROUND_ROBIN(new RoundRobinMasterSlaveLoadBalanceAlgorithm()),
RANDOM(new RandomMasterSlaveLoadBalanceAlgorithm());
private final MasterSlaveLoadBalanceAlgorithm algorithm;
/**
* Get default master-slave database load-balance algorithm type.
*
* @return default master-slave database load-balance algorithm type
*/
public static MasterSlaveLoadBalanceAlgorithmType getDefaultAlgorithmType() {
return ROUND_ROBIN;
}
}
RoundRobinMasterSlaveLoadBalanceAlgorithm
public final class RoundRobinMasterSlaveLoadBalanceAlgorithm implements MasterSlaveLoadBalanceAlgorithm {
private static final ConcurrentHashMap<String, AtomicInteger> COUNT_MAP = new ConcurrentHashMap<>();
@Override
public String getDataSource(final String name, final String masterDataSourceName, final List<String> slaveDataSourceNames) {
AtomicInteger count = COUNT_MAP.containsKey(name) ? COUNT_MAP.get(name) : new AtomicInteger(0); //默认从0开始
COUNT_MAP.putIfAbsent(name, count);
count.compareAndSet(slaveDataSourceNames.size(), 0); // slave如果有多个 到slave.size=count 设置为0 比如slave 有3个 则count=3的时候 设置为0
return slaveDataSourceNames.get(Math.abs(count.getAndIncrement()) % slaveDataSourceNames.size()); // count每次都+1 slave从0开始取,到slave.size-1
}
}
RandomMasterSlaveLoadBalanceAlgorithm
public final class RandomMasterSlaveLoadBalanceAlgorithm implements MasterSlaveLoadBalanceAlgorithm {
@Override
public String getDataSource(final String name, final String masterDataSourceName, final List<String> slaveDataSourceNames) {
return slaveDataSourceNames.get(new Random().nextInt(slaveDataSourceNames.size()));
}
}