Java使用Mybatis-Plus封装动态数据源工具类

一、工具类

java 复制代码
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.util.Set;

/**
 * 动态数据源管理工具类
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class DynamicDataSourceUtil {

    private final DataSource dataSource;
    private final DefaultDataSourceCreator dataSourceCreator;

    /**
     * 动态添加并注册数据源
     *
     * @param key             数据源别名
     * @param url             JDBC URL
     * @param username        账号
     * @param password        密码
     * @param driverClassName 驱动
     */
    public void addDataSource(String key, String url, String username, String password, String driverClassName) {
        // 封装数据源配置属性
        DataSourceProperty dto = new DataSourceProperty();
        dto.setPoolName(key);
        dto.setUrl(url);
        dto.setUsername(username);
        dto.setPassword(password);
        dto.setDriverClassName(driverClassName);

        // 使用 Creator 创建数据源
        DataSource newDataSource = dataSourceCreator.createDataSource(dto);

        // 强制转型并添加至动态管理器
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        ds.addDataSource(key, newDataSource);
        log.info("动态数据源 [{}] 已成功添加。", key);
    }

    /**
     * 移除数据源
     * 移除时会自动调用 close() 方法释放连接池资源
     */
    public void removeDataSource(String key) {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        ds.removeDataSource(key);
        log.info("动态数据源 [{}] 已成功移除。", key);
    }

    /**
     * 获取当前所有激活的数据源名称
     */
    public Set<String> getCurrentDataSources() {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        return ds.getDataSources().keySet();
    }

    /**
     * 判断数据源是否存在
     */
    public boolean exists(String key) {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        return ds.getDataSources().containsKey(key);
    }

    /**
     * 测试数据库连通性
     *
     * @param url      JDBC URL
     * @param username 账号
     * @param password 密码
     * @return boolean 是否连接成功
     */
    public boolean testConnection(String url, String username, String password, String driverClassName) {
        Connection conn = null;
        try {
            // 加载驱动
            Class.forName(driverClassName);

            // 尝试获取连接,设置超时时间为 5 秒,防止长时间卡住
            DriverManager.setLoginTimeout(5);
            conn = DriverManager.getConnection(url, username, password);
            return conn != null;
        } catch (ClassNotFoundException e) {
            log.error("未找到数据库驱动: {}", e.getMessage());
            return false;
        } catch (SQLException e) {
            log.warn("数据库连接测试失败: URL={}, 原因={}", url, e.getMessage());
            return false;
        } finally {
            // 手动释放连接
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    log.error("关闭测试连接异常", e);
                }
            }
        }
    }
}

二、 业务中切换数据源

java 复制代码
// 包路径
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;

// 切换数据源
DynamicDataSourceContextHolder.push(key);


// 使用此数据源
try{
    // 业务逻辑
} finally {
   DynamicDataSourceContextHolder.poll();
}

使用场景,需要在数据库中管理数据源地址并应用到实际业务逻辑中的

相关推荐
共享家95274 小时前
搭建 AI 聊天机器人:”我的人生我做主“
前端·javascript·css·python·pycharm·html·状态模式
Hgfdsaqwr5 小时前
Python在2024年的主要趋势与发展方向
jvm·数据库·python
一晌小贪欢5 小时前
Python 测试利器:使用 pytest 高效编写和管理单元测试
python·单元测试·pytest·python3·python测试
小文数模5 小时前
2026年美赛数学建模C题完整参考论文(含模型和代码)
python·数学建模·matlab
惊讶的猫5 小时前
探究StringBuilder和StringBuffer的线程安全问题
java·开发语言
jmxwzy5 小时前
Spring全家桶
java·spring·rpc
Halo_tjn5 小时前
基于封装的专项 知识点
java·前端·python·算法
Hgfdsaqwr6 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
weixin_395448916 小时前
export_onnx.py_0130
pytorch·python·深度学习
s1hiyu6 小时前
使用Scrapy框架构建分布式爬虫
jvm·数据库·python