package com.baidu.ub.common.dbmanage.router;
import org.apache.log4j.Logger;
import org.springframework.context.support.ApplicationObjectSupport;
import com.baidu.ub.common.dbmanage.datasource.VirtualDataSource;
import com.baidu.ub.common.dbmanage.rule.DBShardingRule;
public class IDRouter extends ApplicationObjectSupport implements Router {
private static Logger log = Logger.getLogger(IDRouter.class);
private String prefix;
private DBShardingRule dbShardingRule;
/**
* @param prefix the prefix to set
*/
public void setPrefix(String prefix) {
this.prefix = prefix;
}
/**
* @param dbShardingRule
*/
public void setDbShardingRule(DBShardingRule dbShardingRule) {
this.dbShardingRule = dbShardingRule;
}
/**
* @see Router#getTargetDataSource(long)
*/
public String getTargetDataSourceKey(int userid, boolean readMaster) {
String vdbkey = prefix;
String dbkey = null;
String dbCode = null;
// userid=0的情况放到下一层处理,需要支持返回dbCode为null的情况,当sharding num为1的时候,需要返回null
dbCode = dbShardingRule.calculateDatabaseNo(userid);
if (dbCode != null) {
vdbkey = new StringBuilder(prefix).append("_").append(dbCode).toString();
}
VirtualDataSource vdb = (VirtualDataSource) getApplicationContext().getBean(vdbkey, VirtualDataSource.class);
if (vdb != null) {
dbkey = vdb.getDataSourceKey(readMaster);
return dbkey;
} else {
String message = "Can't find dbkey mapping to user" + userid;
RuntimeException t = new IllegalArgumentException(message);
log.error(message, t);
throw t;
}
}
}