package com.baidu.ub.common.dbmanage.datasource; import org.apache.log4j.Logger; import com.baidu.ub.common.commons.ThreadContext; import com.baidu.ub.common.dbmanage.router.Router; public class MultiDataSourceKeyContext { private static final Logger log = Logger.getLogger(MultiDataSourceKeyContext.class); private String dbName; private Router router; public void setKey(Integer userid, boolean readMaster) { String dbkey = router.getTargetDataSourceKey(userid, readMaster); setKey(dbkey); } /** * 设置方法调用时使用的key,存入到threadlocal中 */ public void setKey(String key) { if (key == null) { clearKey(); } else { ThreadContext.putContext(dbName, key); } log.debug("set data source key[" + key + "]"); } /** * 获得当前数据源key,如果threadlocal中没有数据源,则返回对应用户的主库连接 */ public String getKey() { String dbkey = ThreadContext.getContext(dbName); if (dbkey == null) { Integer userid = ThreadContext.getShardKey(); if (userid == null) { userid = 0; // throw new // RuntimeException("No userid contexted,so you can't know how to routing!!"); } dbkey = router.getTargetDataSourceKey(userid, true); StackTraceElement[] elements = Thread.currentThread().getStackTrace(); logTrace(dbkey, elements); } return dbkey; } private void logTrace(String dbkey, StackTraceElement[] elements) { if (elements == null || elements.length == 0) { return; } for (StackTraceElement ste : elements) { if (ste.getClassName().indexOf("service.impl") > 0) { log.debug("no transaction data source Key[" + dbkey + "," + ste.getClassName() + "." + ste.getMethodName() + ",line number:" + ste.getLineNumber() + "]"); return; } } for (StackTraceElement ste : elements) { log.debug("no transaction data source Key[" + dbkey + "," + ste.getClassName() + "." + ste.getMethodName() + ",line number:" + ste.getLineNumber() + "]"); } return; } /** * 获得当前dataSourceContext中实际保存的数据源key,没有就返回null */ public String getActualContextKey() { // String dbkey = DB_KEY.get(); String dbkey = ThreadContext.getContext(dbName); log.debug("get data source Key[" + dbkey + "]"); return dbkey; } /** * 清除设置的key */ public void clearKey() { ThreadContext.remove(dbName); } public void setRouter(Router router) { this.router = router; } public void setDbName(String dbName) { this.dbName = dbName; } }