springboot动态连接多数据源

本文记录了在SpringBoot中动态连接和切换多个数据库数据源的实现过程。涉及的关键步骤包括:配置不同的数据库URL,使用ThreadLocal保存数据源,自定义DynamicDataSource继承AbstractRoutingDataSource,DataSourceConfig类创建数据源,通过自定义注解TargetDataSource和切面类DynamicDataSourceAspect实现注解驱动的数据源切换,以及在实际服务中应用并测试切换效果。
摘要由CSDN通过智能技术生成

需求:不同的方法在获取数据时,动态的切换来自不同的数据库数据源,本篇文章仅用于记录学习过程,若觉得写的不够详细,还请谅解。

一、数据库配置文件application.properties,请注意下面的两个URL写法不一样,两种写法对应后面创建连接的方法不一样,这里都试一下。

mybatis.mapper-locations=classpath:mapper/*.xml
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/ceshi?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&allowMultiQueries=true
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver


#spring.datasource.second.jdbc-url=jdbc:mysql://localhost:3306/ceshi2?useSSL=false
spring.datasource.second.url=jdbc:mysql://localhost:3306/ceshi2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&allowMultiQueries=true
spring.datasource.second.username=root
spring.datasource.second.password=root
spring.datasource.second.driver-class-name=com.mysql.jdbc.Driver

二、DynamicDatasourceHolder类,该类用于操作和保存创建的连接,用ThreadLocal保存创建的数据源,可适用于并发操作,ThreadLocal的用法和好处可自行百度。

/*
 * 通过ThreadLocal维护一个全局唯一的map来实现数据源的动态切换
 */
public class DynamicDatasourceHolder {
	private static final ThreadLocal<String> DATASOURCE_HOLDER = new ThreadLocal<String>();
    /** * 数据源的 key 集合,用于切换时判断数据源是否存在 */
    public static List<Object> dataSourceKeys = new ArrayList<>();
    
    /** * To switch DataSource * * @param key the key */
    public static void setDataSourceKey(String key) {
    	DATASOURCE_HOLDER.set(key);
    }
    /** * Get current DataSource * * @return data source key */
    public static String getDataSourceKey() {
        return DATASOURCE_HOLDER.get();
    }
    /** * To set DataSource as default */
    public static void clearDataSourceKey() {
    	DATASOURCE_HOLDER.remove();
    }
    /** * Check if give DataSource is in current DataSource list * * @param key the key * @return boolean boolean */
    public static boolean containDataSourceKey(String key) {
        return dataSourceKeys.contains(key);
    }

三、DynamicDataSource类,该类必须要继承AbstractRoutingDataSource方法,并实现其AbstractRoutingDataSource方法,AbstractRoutingDataSource类亦可自行百度。

	@Override
	protected Object determineCurrentLookupKey() {
	        return DynamicDatasourceHolder.getDataSourceKey();
	}

四、DataSourceConfig类,该类为关键核心类,用于通过读取配置文件并根据不同的数据库连接参数创建不同的数据源,这里在创建两个不同的数据源时,使用了两种不同的创建方式分别为DataSourceBuilder.create().build()方法和com.alibaba.druid.pool.DruidDataSource(),这两种方法在使用时配置文件中的url参数写法略有不同,分别为.url和.jdbc-url请留意。

/**
 * ClassName: DataSourceConfig
 * Describe:
 * 数据源配置
 */
@MapperScan(basePackages = "com.hz.GeoDataSystem.dao
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值