package com.baidu.ub.common.dbmanage.rule; import java.util.ArrayList; import java.util.List; import java.util.Random; import org.apache.log4j.Logger; public class SimpleDBShardingRuleImpl implements DBShardingRule { private static Logger log = Logger.getLogger(SimpleDBShardingRuleImpl.class); protected Random randomprovider = new Random(); private int tableShardingLength = 6; private int shardingNum = 1; private List<String> dbCodeCollection; public String calculateDatabaseNo(int userid) { if (shardingNum == 1) { return null; } int useridcode = 0; if (userid <= 0) { throw new RuntimeException("No userid contexted,so you can't know how to routing!!"); //考虑随机路由到其中的某个库 //useridcode = randomprovider.nextInt(shardingNum); } else { useridcode = (int) ((userid >>> tableShardingLength) & (shardingNum - 1)); } return dbCodeCollection.get(useridcode); } /** * @param shardingNum the shardingNum to set */ public void setShardingNum(int shardingNum) { if ((shardingNum & (shardingNum - 1)) != 0) { String message = "shardingNum should be a power of 2, like 4,8,16,32"; RuntimeException t = new IllegalArgumentException(message); log.error(message, t); throw t; } this.shardingNum = shardingNum; setDbCodeCollection(); } /** * 初始化dbcode的集合,依赖于数据库的shardingNum */ private void setDbCodeCollection() { dbCodeCollection = new ArrayList<String>(shardingNum); int codeLength = Integer.toBinaryString(shardingNum - 1).length(); for (int i = 0; i < shardingNum; i++) { String dbcode = Integer.toBinaryString(i); for (int j = dbcode.length(); j < codeLength; j++) { dbcode = "0" + dbcode; } dbCodeCollection.add(i, dbcode); } } }