package com.baidu.ub.common.dbmanage.datasource; import java.io.Serializable; import java.util.List; import java.util.Random; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; public class VirtualDataSource implements Serializable, BeanNameAware, InitializingBean { protected static final Logger log = LoggerFactory.getLogger(VirtualDataSource.class); private static final long serialVersionUID = 2391107997087589405L; protected List<String> masterSet; protected List<String> slaveSet; protected List<String> masterPools; protected List<String> slavePools; protected int loadbalance = 1; // 1:random 2:polling 3:master-backup protected Random randomprovider = new Random(); protected int current = 0; protected String vdbid; public List<String> getMasterSet() { return masterSet; } public void setMasterSet(List<String> masterSet) { this.masterSet = masterSet; this.masterPools = masterSet; } public List<String> getSlaveSet() { return slaveSet; } public void setSlaveSet(List<String> slaveSet) { this.slaveSet = slaveSet; this.slavePools = slaveSet; } public void setMasterPools(List<String> masterPool) { this.masterPools = masterPool; } public List<String> getMasterPools() { return masterPools; } public void setSlavePools(List<String> slavePools) { this.slavePools = slavePools; } public List<String> getSlavePools() { return slavePools; } public void setLoadbalance(int loadbalance) { this.loadbalance = loadbalance; } public String getDataSourceKey(boolean readMaster) { if (readMaster) { return getMasterDataSourceKey(); } else { return getSlaveDataSourceKey(); } } public String getMasterDataSourceKey() { if (masterPools == null) { throw new IllegalStateException("master datasource is null,can't execute the write sql"); } int idx = chooseDSKeyIndex(masterPools.size()); return masterPools.get(idx); } public String getSlaveDataSourceKey() { if (slavePools == null || slavePools.size() == 0) { log.warn("read null slave datasource!"); return getMasterDataSourceKey(); } int idx = chooseDSKeyIndex(slavePools.size()); return slavePools.get(idx); } private int chooseDSKeyIndex(int N) { int idx = 0; if (loadbalance == 1) { idx = randomprovider.nextInt(N); log.debug("use random datasource."); } else if (loadbalance == 2) { current++; if (current >= N) { current = 0; } idx = current; log.debug("user polling datasource."); } else if (loadbalance == 3) { idx = 0; log.debug("user master-backup datasource."); } return idx; } public void afterPropertiesSet() throws Exception { if (masterPools == null) { throw new IllegalStateException("visualdatasource initial fail,master pool is null!"); } } public void setBeanName(String name) { this.vdbid = name; } public String getVdbid() { return this.vdbid; } }