springboot动态数据源切换

1,通过jdbc的方式动态切换数据源,实现既关即停,即开即用

@Component
@Slf4j
public class MySqlConfiguration {
    /**
     * mysql数据源
     */
    private Map<String, HikariDataSource> mySqlDataSources = new HashMap<>();

    /**
     * jdbcTemplate key:数据源唯一标识  value:jdbcTemplate
     */
    public Map<String, JdbcTemplate> mySqlJdbcTemplate = new HashMap<>();

    @PostConstruct
    private void init() {
        //根据数据库配置信息
        String mysqlConnection = "jdbc:mysql://rm-wz9926drc689m9g2j.mysql.rds.aliyuncs.com:3306/dcp_sit?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai";
        String userName = "dcp_sit";
        String password = "r9sRRxl#^";
        String uniqueCode = "dcp_sit";
        //根据数据库唯一标识 生成jdbcTemplate
        jdbcTemplate(mysqlConnection, userName, password,uniqueCode);

    }

    @PreDestroy
    private void destroy() {
        //销毁所有的连接池
        released();
    }

    /**
     * 释放连接池
     */
    private void released() {
        if (null != mySqlDataSources) {
            for (Map.Entry<String, HikariDataSource> entry : mySqlDataSources.entrySet()) {
                HikariDataSource hikariDataSource = entry.getValue();
                if (null != hikariDataSource) {
                    hikariDataSource.close();
                }
            }
        }
    }

    /**
     * 根据名称释放连接池
     */
    public void releasedByName(String name) {
        if (null != mySqlDataSources) {
            for (Map.Entry<String, HikariDataSource> entry : mySqlDataSources.entrySet()) {
                if(entry.getKey().equals(name)){
                    HikariDataSource hikariDataSource = entry.getValue();
                    if (null != hikariDataSource) {
                        hikariDataSource.close();
                        mySqlJdbcTemplate.remove(name);
                    }
                }
            }
        }
    }

    public void addDataSource(){
        //根据数据库配置信息
        String mysqlConnection1 = "jdbc:mysql://rm-wz9926drc689m9g2j.mysql.rds.aliyuncs.com:3306/dcp_dev?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai";
        String userName1 = "dcp_sit";
        String password1 = "r9sRRxl#^";
        String uniqueCode1 = "dcp_dev";
        //根据数据库唯一标识 生成jdbcTemplate
        jdbcTemplate(mysqlConnection1, userName1, password1,uniqueCode1);
    }
    /**
     * 初始化mysql连接
     *
     * @param mysqlConnectionUrl
     * @param userName
     * @param password
     * @param uniqueCode
     */
    private void jdbcTemplate(String mysqlConnectionUrl, String userName, String password, String uniqueCode) {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(mysqlConnectionUrl);
        hikariConfig.setUsername(userName);
        hikariConfig.setPassword(password);
        HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
        Connection connection = DataSourceUtils.getConnection(hikariDataSource);
        try {
            boolean closed = connection.isClosed();
            if (!closed) {
                JdbcTemplate jdbcTemplate = new JdbcTemplate(hikariDataSource);
                mySqlDataSources.put(uniqueCode, hikariDataSource);
                mySqlJdbcTemplate.put(uniqueCode, jdbcTemplate);
            }
        } catch (SQLException e) {
            log.error("Connect Tenant MySql Fail :{}", e);
        }
    }
}

如果想要使用那个数据源就去mySqlJdbcTemplate里取,关闭就从mySqlJdbcTemplate删除

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值