yaml文件里的:spring:datasource:one:jdbc-url: jdbc:mysql://127.0.0.1:3306/bet?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=trueusername: rootpassword: roottwo:jdbc-url: jdbc:mysql://127.0.0.2:3306/bet?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=trueusername: rootpassword: rootthree:jdbc-url: jdbc:mysql://127.0.0.3:3306/bet?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=trueusername: rootpassword: root
package com.mybet.server.admin.annotation;import java.lang.annotation.*;/*** 动态数据源注解*/
@Target( { ElementType.METHOD, ElementType.TYPE } )
@Retention( RetentionPolicy.RUNTIME )
@Documented
public @interface DataSource {/*** 数据源key值** @return*/String value();}
package com.mybet.server.admin.aspect;import com.mybet.server.admin.annotation.DataSource;
import com.mybet.server.admin.config.dds.DynamicDataSourceContextHolder;
import lombok.extern.log4j.Log4j2;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;/*** 动态数据源切换处理器*/
@Log4j2
@Aspect
@Order( -1 )  // 该切面应当先于 @Transactional 执行
@Component
public class DynamicDataSourceAspect {/*** 切换数据源*/@Before( "@annotation(dataSource))" )public void switchDataSource( JoinPoint point, DataSource dataSource ) {if ( !DynamicDataSourceContextHolder.containDataSourceKey( dataSource.value() ) ) {log.warn( "DataSource [{}] doesn't exist, use default DataSource [{}] " + dataSource.value() );} else {// 切换数据源DynamicDataSourceContextHolder.setDataSourceKey( dataSource.value() );log.warn( "Switch DataSource to [" + DynamicDataSourceContextHolder.getDataSourceKey()+ "] in Method [" + point.getSignature() + "]" );}}/*** 重置数据源*/@After( "@annotation(dataSource))" )public void restoreDataSource( JoinPoint point, DataSource dataSource ) {// 将数据源置为默认数据源DynamicDataSourceContextHolder.clearDataSourceKey();log.warn( "Restore DataSource to [" + DynamicDataSourceContextHolder.getDataSourceKey()+ "] in Method [" + point.getSignature() + "]" );}
}
package com.mybet.server.admin.config.dds;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import javax.sql.DataSource;
import java.util.Map;/*** 动态数据源实现类*/
public class DynamicDataSource extends AbstractRoutingDataSource {/*** 如果不希望数据源在启动配置时就加载好,可以定制这个方法,从任何你希望的地方读取并返回数据源 比如从数据库、文件、外部接口等读取数据源信息,并最终返回一个DataSource实现类对象即可*/@Overrideprotected DataSource determineTargetDataSource() {return super.determineTargetDataSource();}/*** 如果希望所有数据源在启动配置时就加载好,这里通过设置数据源Key值来切换数据,定制这个方法*/@Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceContextHolder.getDataSourceKey();}/*** 设置默认数据源*/public void setDefaultDataSource( Object defaultDataSource ) {super.setDefaultTargetDataSource( defaultDataSource );}/*** 设置数据源*/public void setDataSources( Map<Object, Object> dataSources ) {super.setTargetDataSources( dataSources );// 将数据源的 key 放到数据源上下文的 key 集合中,用于切换时判断数据源是否有效DynamicDataSourceContextHolder.addDataSourceKeys( dataSources.keySet() );}
}
package com.mybet.server.admin.config.dds;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;/*** 动态数据源上下文*/
public class DynamicDataSourceContextHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>() {/*** 将 master 数据源的 key作为默认数据源的 key*/@Overrideprotected String initialValue() {return "dbdata";}};/*** 数据源的 key集合,用于切换时判断数据源是否存在*/public static List<Object> dataSourceKeys = new ArrayList<>();/*** 切换数据源*/public static void setDataSourceKey( String key ) {contextHolder.set( key );}/*** 获取数据源** @return*/public static String getDataSourceKey() {return contextHolder.get();}/*** 重置数据源*/public static void clearDataSourceKey() {contextHolder.remove();}/*** 判断是否包含数据源** @param key 数据源key* @return*/public static boolean containDataSourceKey( String key ) {return dataSourceKeys.contains( key );}/*** 添加数据源keys** @return*/public static boolean addDataSourceKeys( Collection<? extends Object> keys ) {return dataSourceKeys.addAll( keys );}
}
package com.mybet.server.admin.config;import com.mybet.server.admin.config.dds.DynamicDataSource;
import com.zaxxer.hikari.HikariDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Configuration
@MapperScan( basePackages = { "com.mybet.server.admin.mapper" } ) // 扫描Mapper
public class MybatisConfig {@Bean( "oneDataSource" )@Primary@ConfigurationProperties( prefix = "spring.datasource.one" )public DataSource oneDataSource() {return DataSourceBuilder.create().type( HikariDataSource.class ).build();}@Bean( "twoDataSource" )@ConfigurationProperties( prefix = "spring.datasource.two" )public DataSource twoDataSource() {return DataSourceBuilder.create().type( HikariDataSource.class ).build();}@Bean( "threeDataSource" )@ConfigurationProperties( prefix = "spring.datasource.three" )public DataSource threeDataSource() {return DataSourceBuilder.create().type( HikariDataSource.class ).build();}@Bean( "dynamicDataSource" )public DataSource dynamicDataSource() {DynamicDataSource   dynamicDataSource = new DynamicDataSource();Map<Object, Object> dataSourceMap     = new HashMap<>();dataSourceMap.put( "one", oneDataSource() );dataSourceMap.put( "two", twoDataSource() );dataSourceMap.put( "three", threeDataSource() );// 将 master 数据源作为默认指定的数据源dynamicDataSource.setDefaultDataSource( oneDataSource() );// 将 master 和 slave 数据源作为指定的数据源dynamicDataSource.setDataSources( dataSourceMap );return dynamicDataSource;}@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean( @Qualifier( "dynamicDataSource" ) DataSource dynamicDataSource,MybatisProperties mybatisProperties ) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();// 配置数据源,此处配置为关键配置,如果没有将 dynamicDataSource作为数据源则不能实现切换sessionFactory.setDataSource( dynamicDataSource );// 扫描ModelsessionFactory.setTypeAliasesPackage( "com.mybet.server.admin.domain" );PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();// 扫描映射文件sessionFactory.setMapperLocations( resolver.getResources( "classpath*:mapper/*.xml" ) );sessionFactory.setConfiguration( mybatisProperties.getConfiguration() );return sessionFactory;}@Beanpublic DataSourceTransactionManager transactionManager( @Qualifier( "dynamicDataSource" ) DataSource dynamicDataSource ) {// 配置事务管理, 使用事务时在方法头部添加@Transactional注解即可return new DataSourceTransactionManager( dynamicDataSource );}
}

-----------------以上是配置,以下是业务使用------------------

package com.mybet.server.admin.utils;import com.mybet.server.admin.config.dds.DynamicDataSourceContextHolder;//指定数据源
public class DataSourceHolder {public static void setDataSourceKey(String number){String dataKey;switch (number){case "1":dataKey = "one";break;case "2":dataKey = "two";break;case "3":dataKey = "three";break;default:dataKey = "one";}DynamicDataSourceContextHolder.setDataSourceKey(dataKey);}//重置多数据源public static void clearDataSourceKey(){DynamicDataSourceContextHolder.clearDataSourceKey();}
}

多数据源的配置和使用相关推荐

  1. SpringBoot (八) :Spring Boot多数据源(JdbcTemplate)配置与使用

    什么是JdbcTemplate 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架. 作为 SpringJDBC 框架的核心, JDB ...

  2. 2 数据源配置_Quick BI支持哪些数据源(配置操作篇)

    Quick BI 潜心打造了核心技术底座(OLAP分析引擎),实现了SQL解析.SQL调度.SQL优化.查询加速等基础能力,支撑Quick BI的数据分析和查询加速.OLAP分析引擎包括数据源连接.数 ...

  3. JNDI数据源的配置

    一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");)    ②连接数据库(Conne ...

  4. SpringBoot(配置druid数据源、配置MyBatis、事务控制、druid 监控)

    SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少 数据层操作,所有的开发都一定秉持着 MVC 设计模式的原则,MVC 里面业务层不可少 ...

  5. resin 4.0数据源的配置

    在resin 的conf 文件下有resin.xml  我们在这里能够配置数据源以及配置项目 一.配置多个数据源,多个项目共享这些数据源.也就是这些数据源配置在<host>   </ ...

  6. 数据源的配置和使用 视频下载

    [浪曦][原创][A362]数据源的配置和使用(BLing原创),请用迅雷下载,可能需要注册! 包括servlet调用数据源,spring调用数据源 转载于:https://blog.51cto.co ...

  7. jboss4。0下mysql数据源的配置

    花了一个小时的时间,搞了一下jboss4.0下mysql数据源的配置.下面是一些具体过程 1.首先安装mysql数据库并将其驱动程序考到jboss的server\default\lib下面 2.将my ...

  8. 2 数据源配置_Spring, MyBatis 多数据源的配置和管理

    作者:digdeep 出处:https://www.cnblogs.com/digdeep/p/4512368.html 热门推荐 vue+websocket+Springboot实现的即时通信开源项 ...

  9. JNDI学习总结(2)——JNDI数据源的配置

    一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");)    ②连接数据库(Conne ...

  10. weblogic mysql数据源配置文件_通过weblogic数据源实现配置oracle and mysql方法

    通过weblogic数据源实现配置oracle and mysql方法 发布时间:2020-05-28 17:05:56 来源:51CTO 阅读:151 作者:三月 下文主要给大家带来通过weblog ...

最新文章

  1. C++资源之不完全导引(上)
  2. 李刚java视频_《Srping视频教程》疯狂Java 李刚老师[WMV]
  3. java 捕获数据包,缓存从pcap捕获的数据包
  4. 全国计算机等级考试一级ps考试试题,计算机等级考试一级ps考前试题及答案
  5. Centos6.3修改源码遇到无法yum安装的问题
  6. c语言字符串去重简单,C语言实现简单飞机大战
  7. 玩转mini2440开发板之【编译烧录rootfs根文件系统全过程记录】
  8. linux中的memory management和page mapping
  9. linux监控mysql性能,MySQL 性能监控4大指标——第二部分
  10. [转载] python中的且语句_简单探讨python中的语句和语法
  11. Reflector 3在录制中如何添加自己的声音
  12. linux查看及修改文件权限以及相关
  13. 天线年会 闭幕式 ppt_OracleVS谷歌–闭幕式,陪审团审议版权阶段
  14. AI在医疗领域的应用 | “AI+传统行业”全盘点
  15. zabbix Lack of free swap space
  16. Unity不规则按钮点击区域(UGUI)
  17. VFP获取微信小程序用户openID,易如反掌
  18. 破解IntelliJ IDEA 2017.1到2099年
  19. AspectJ 切入点表达式
  20. BaseQuickAdapter 条目复用问题

热门文章

  1. 什么是算法?算法的5个特性
  2. python操作网页界面_python3 操作页面上各种元素的方法
  3. 论文结论写什么,如何写?
  4. java全栈系列之JavaSE-编写银行基金收益系统031
  5. Python:数的分解
  6. 虚拟定位的实现android,王者荣耀战区哪里分最低 王者荣耀低分战区推荐
  7. 关于c语言中 scanf 对多行字符的输入问题
  8. K-means,K-means++方法详解-机器学习分类问题常见算法
  9. RxJava2基础总结(二)
  10. sklearn.metrics 用法详解