package admin.asept;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description 动态数据源
 * @Author lzl
 * @Date 2021-04-22
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    /**
     * ThreadLocal 用于提供线程局部变量,在多线程环境可以保证各个线程里的变量独立于其它线程里的变量。
     * 也就是说 ThreadLocal 可以为每个线程创建一个【单独的变量副本】,相当于线程的 private static 类型变量。
     */
    private static final ThreadLocal<String> dataSourceName = new ThreadLocal<String>();
    /**
     * 支持以包名的粒度选择数据源
     */
    private static final Map<String, String> packageDataSource = new HashMap<>();

    public DynamicDataSource(DataSource firstDataSource, Map<Object, Object> targetDataSources) {
        setDefaultTargetDataSource(firstDataSource);
        setTargetDataSources(targetDataSources);
        afterPropertiesSet();
    }

    /**
     * 获取与线程上下文绑定的数据源名称(存储在ThreadLocal中)
     *
     * @return 返回数据源名称
     */
    @Override
    protected Object determineCurrentLookupKey() {
        String dsName = dataSourceName.get();
        dataSourceName.remove();
        return dsName;
    }

    public static void setDataSourceName(String dataSource) {
        dataSourceName.set(dataSource);
    }

    public static void usePackageDatasourceKey(String pkName) {
        dataSourceName.set(packageDataSource.get(pkName));
    }

    public Map<String, String> getPackageDatasource() {
        return packageDataSource;
    }

    public void setPackageDatasource(Map<String, String> packageDatasource) {
        this.packageDataSource.putAll(packageDatasource);
    }
}