package jakiro.datasource; import jakiro.datasource.factory.IDataSourceManagerTool; import jakiro.datasource.threadlocal.DataSourceContextHolder; import jakiro.util.Validate; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import javax.sql.DataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; import com.alibaba.druid.pool.DruidDataSource; public class DynamicCoreDataSource extends AbstractRoutingDataSource { protected static Logger LOG = LoggerFactory.getLogger(DynamicCoreDataSource.class); public static Map<String, DynamicCoreDataSource> REG = new HashMap<String, DynamicCoreDataSource>(); protected Map<Object, Object> tmp_targetDataSources = new HashMap<Object, Object>(); protected DataSource tmp_defaultTargetDataSource; protected String dynamicCoreDataSourceName = null; public String getDynamicCoreDataSourceName() { return dynamicCoreDataSourceName; } public void setDynamicCoreDataSourceName(String dynamicCoreDataSourceName) { this.dynamicCoreDataSourceName = dynamicCoreDataSourceName; } protected String dataSourceClassName = DruidDataSource.class.getCanonicalName(); public String getDataSourceClassName() { return dataSourceClassName; } public void setDataSourceClassName(String dataSourceClassName) { this.dataSourceClassName = dataSourceClassName; } protected volatile boolean closed = false; @Override public void afterPropertiesSet() { Validate.notBlank(dynamicCoreDataSourceName, "DynamicCoreDataSourceName is null"); super.setTargetDataSources(tmp_targetDataSources); super.afterPropertiesSet(); REG.put(dynamicCoreDataSourceName, this); } @Override public void setDefaultTargetDataSource(Object defaultTargetDataSource) { tmp_defaultTargetDataSource = (DataSource) defaultTargetDataSource; super.setDefaultTargetDataSource(defaultTargetDataSource); } @Override public void setTargetDataSources(Map<Object, Object> targetDataSources) { tmp_targetDataSources.putAll(targetDataSources); } public Map<Object, Object> getTmp_targetDataSources() { return tmp_targetDataSources; } @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceName(); } public synchronized void close() { if (closed) { return; } closed = true; for (Entry<Object, Object> e : tmp_targetDataSources.entrySet()) { IDataSourceManagerTool.getHandler(dataSourceClassName).destroyDataSource((DataSource) e.getValue()); } IDataSourceManagerTool.getHandler(dataSourceClassName).destroyDataSource(tmp_defaultTargetDataSource); } }