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();
}

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

相关推荐
米码收割机9 小时前
【项目】spring boot+vue3 宠物领养系统(源码+文档)【独一无二】
java·spring boot·宠物
叶 落9 小时前
Mac 通过 Miniconda 安装 Python
python·macos·conda·miniconda
刹那芳华199210 小时前
STMF+ESP-S+MQTT协议连接华为云端(附踩坑记录)
java·struts·华为
就改了15 小时前
Java8 日期处理(详细版)
java·python·算法
麻瓜生活睁不开眼16 小时前
Android16定制SearchLauncher新增投屏Cast桌面快捷图标完整实现
java·launcher·aosp16
IT小盘17 小时前
12-Prompt不等于一句话-System-User-Context三层结构
java·windows·prompt
威联通安全存储18 小时前
TS-h1887XU-RP在汽车发动机热试与NVH在线质检网中的部署
python·汽车
都叫我大帅哥18 小时前
Spring Data JPA 查询之道:方法命名与示例查询完全指南
java·后端·spring
momo18 小时前
Java+WebAI黑马知识点
java·spring boot·mybatis
qq_3164110319 小时前
腹腔镜模拟手术训练数字化管理平台构建
人工智能·python·深度学习·机器学习