package com.taobao.tddl.atom;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import com.taobao.tddl.atom.common.TAtomConstants;
import com.taobao.tddl.atom.config.TAtomDsConfHandle;
import com.taobao.tddl.atom.config.listener.AtomDbStatusListener;
import com.taobao.tddl.atom.exception.AtomAlreadyInitException;
import com.taobao.tddl.common.utils.TStringUtil;
import com.taobao.tddl.common.utils.logger.Logger;
import com.taobao.tddl.common.utils.logger.LoggerFactory;
/**
* 动态数据源,支持数据源参数动态修改
*
* @author qihao
*/
public class TAtomDataSource extends AbstractTAtomDataSource {
protected static Logger logger = LoggerFactory.getLogger(TAtomDataSource.class);
private static Map<String, TAtomDsConfHandle> cacheConfHandleMap = new HashMap<String, TAtomDsConfHandle>();
private volatile TAtomDsConfHandle dsConfHandle = new TAtomDsConfHandle();
@Override
public void init(String appName, String dsKey, String unitName) throws Exception {
setAppName(appName);
setDbKey(dsKey);
setUnitName(unitName);
init();
}
public void init() throws Exception {
String dbName = TAtomConstants.getDbNameStr(this.getUnitName(), this.getAppName(), this.getDbKey());
synchronized (cacheConfHandleMap) {
TAtomDsConfHandle cacheConfHandle = cacheConfHandleMap.get(dbName);
if (null == cacheConfHandle) {
// 初始化config的管理器
this.dsConfHandle.init();
cacheConfHandleMap.put(dbName, dsConfHandle);
logger.info("create new TAtomDsConfHandle dbName : " + dbName);
} else {
dsConfHandle = cacheConfHandle;
logger.info("use the cache TAtomDsConfHandle dbName : " + dbName);
}
}
}
/**
* 清除掉所有数据源
*/
public static void cleanAllDataSource() {
synchronized (cacheConfHandleMap) {
for (TAtomDsConfHandle handles : cacheConfHandleMap.values()) {
try {
handles.destroyDataSource();
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
cacheConfHandleMap.clear();
}
}
/**
* 刷新数据源
*/
public void flushDataSource() {
this.dsConfHandle.flushDataSource();
}
/**
* 销毁数据源,慎用
*
* @throws Exception
*/
public void destroyDataSource() throws Exception {
String dbName = TAtomConstants.getDbNameStr(this.getUnitName(), this.getAppName(), this.getDbKey());
synchronized (cacheConfHandleMap) {
this.dsConfHandle.destroyDataSource();
cacheConfHandleMap.remove(dbName);
}
}
public String getAppName() {
return this.dsConfHandle.getAppName();
}
public String getDbKey() {
return this.dsConfHandle.getDbKey();
}
public void setAppName(String appName) throws AtomAlreadyInitException {
this.dsConfHandle.setAppName(TStringUtil.trim(appName));
}
public void setDbKey(String dbKey) throws AtomAlreadyInitException {
this.dsConfHandle.setDbKey(TStringUtil.trim(dbKey));
}
public void setUnitName(String unitName) {
this.dsConfHandle.setUnitName(unitName);
}
public String getUnitName() {
return this.dsConfHandle.getUnitName();
}
public TAtomDbStatusEnum getDbStatus() {
return this.dsConfHandle.getStatus();
}
public void setDbStatusListeners(List<AtomDbStatusListener> dbStatusListeners) {
this.dsConfHandle.setDbStatusListeners(dbStatusListeners);
}
public void setSingleInGroup(boolean isSingleInGroup) {
this.dsConfHandle.setSingleInGroup(isSingleInGroup);
}
/** =======以下是设置本地优先的配置属性,如果设置了会忽略推送的配置而使用本地的配置======= */
public void setPasswd(String passwd) throws AtomAlreadyInitException {
this.dsConfHandle.setLocalPasswd(passwd);
}
public void setDriverClass(String driverClass) throws AtomAlreadyInitException {
this.dsConfHandle.setLocalDriverClass(driverClass);
}
public TAtomDbTypeEnum getDbType() {
return this.dsConfHandle.getDbType();
}
public void setSorterClass(String sorterClass) throws AtomAlreadyInitException {
this.dsConfHandle.setLocalSorterClass(sorterClass);
}
public void setConnectionProperties(Map<String, String> map) throws AtomAlreadyInitException {
this.dsConfHandle.setLocalConnectionProperties(map);
}
protected DataSource getDataSource() throws SQLException {
return this.dsConfHandle.getDataSource();
}
}