相关文章推荐
飘逸的饼干  ·  PostgreSQL ...·  10 月前    · 
发财的蚂蚁  ·  java.lang.nullpointere ...·  1 年前    · 
无邪的夕阳  ·  javascript - ...·  1 年前    · 

流程解释:

一、pom依赖

	<!-- druid连接池 -->
	<dependency>
	    <groupId>com.alibaba</groupId>
	    <artifactId>druid</artifactId>
	    <version>1.2.1</version>
	</dependency>
	<dependency>
	    <groupId>com.alibaba</groupId>
	    <artifactId>druid-spring-boot-starter</artifactId>
	    <version>1.2.4</version>
	</dependency>

二、yml配置文件

spring:
  datasource:
    #####RuoYi多数据源配置#####
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # 主库数据源
      master:
        url: jdbc:mysql://localhost:3306/day27?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
      # 从库数据源
      slave:
        # 从数据源开关/默认关闭 false/true
        enabled: true
        url: jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 配置一个连接在池中最大生存的时间,单位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # 配置检测连接是否有效
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false

三、自定义切换数据源注解

* @author :LiuShihao * @date :Created in 2021/5/20 10:04 上午 * @desc :自定义多数据源切换注解 * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 @Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface DataSource * 切换数据源名称 public DataSourceType value() default DataSourceType.MASTER;

四、定义AOP切面切换数据源

* 多数据源处理 * 注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级, * 而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响; * 默认是最低优先级,值越小优先级越高 * @author ruoyi @Aspect @Order(1) @Component public class DataSourceAspect { protected Logger logger = LoggerFactory.getLogger(getClass()); @Pointcut("@annotation(com.lsh.anno.DataSource) || @within(com.lsh.anno.DataSource)") public void dsPointCut() { @Around("dsPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { DataSource dataSource = getDataSource(point); if (dataSource != null) { DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); try { return point.proceed(); finally { // 销毁数据源 在执行方法之后 DynamicDataSourceContextHolder.clearDataSourceType(); * 获取需要切换的数据源 public DataSource getDataSource(ProceedingJoinPoint point) { MethodSignature signature = (MethodSignature) point.getSignature(); DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); if (Objects.nonNull(dataSource)) { return dataSource; return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class);

五、读取Druid连接池配置

* @author :LiuShihao * @date :Created in 2021/5/20 10:31 上午 * @desc :Druid连接池配置 @Configuration public class DruidProperties @Value("${spring.datasource.druid.initialSize}") private int initialSize; @Value("${spring.datasource.druid.minIdle}") private int minIdle; @Value("${spring.datasource.druid.maxActive}") private int maxActive; @Value("${spring.datasource.druid.maxWait}") private int maxWait; @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") private int maxEvictableIdleTimeMillis; @Value("${spring.datasource.druid.validationQuery}") private String validationQuery; @Value("${spring.datasource.druid.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.druid.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.druid.testOnReturn}") private boolean testOnReturn; * 初始化Druid数据源 * @param datasource * @return public DruidDataSource dataSource(DruidDataSource datasource) { /** 配置初始化大小、最小、最大 */ datasource.setInitialSize(initialSize); datasource.setMaxActive(maxActive); datasource.setMinIdle(minIdle); /** 配置获取连接等待超时的时间 */ datasource.setMaxWait(maxWait); /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 datasource.setValidationQuery(validationQuery); /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ datasource.setTestWhileIdle(testWhileIdle); /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ datasource.setTestOnBorrow(testOnBorrow); /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ datasource.setTestOnReturn(testOnReturn); return datasource;

六、Druid多数据源配置类

* druid 配置多数据源 * @Date 2021年05月20日10:30:46 * @author ruoyi * 需要在启动类排除DataSource的自动配置类,否则会出现循环引用的问题 * org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration * ┌─────┐ * | dynamicDataSource defined in class path resource [com/lsh/config/DruidConfig.class] * ↑ ↓ * | masterDataSource defined in class path resource [com/lsh/config/DruidConfig.class] * ↑ ↓ * | org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker * └─────┘ @Configuration public class DruidConfig{ @Bean @ConfigurationProperties("spring.datasource.druid.master") public DataSource masterDataSource(DruidProperties druidProperties) { System.out.println("注入主数据源"); DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); return druidProperties.dataSource(dataSource); @Bean @ConfigurationProperties("spring.datasource.druid.slave") @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") public DataSource slaveDataSource(DruidProperties druidProperties) { System.out.println("注入从数据源"); DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); return druidProperties.dataSource(dataSource); * 改进:直接使用@Qualifier注解指定将两个数据源作为入参 * @param masterDataSource * @param slaveDataSource * @return @Bean(name = "dynamicDataSource") @Primary public DynamicDataSource dataSource(@Qualifier("masterDataSource")DataSource masterDataSource, @Qualifier("slaveDataSource")DataSource slaveDataSource) { System.out.println("注入动态数据源"); Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); targetDataSources.put(DataSourceType.SLAVE.name(), slaveDataSource); return new DynamicDataSource(masterDataSource, targetDataSources);

七、配置动态数据源

SpringAbstractRoutingDataSource就是采用这种架构。
重点是determineTargetDataSource方法:
在这里插入图片描述

重点在于determineCurrentLookupKey()方法,这是AbstractRoutingDataSource类中的一个抽象方法,而它的返回值是你所要用的数据源dataSourcekey值,有了这个key值,resolvedDataSource(这是个map)就从中取出对应的DataSource,如果找不到,就用配置默认的数据源。

扩展AbstractRoutingDataSource类,并重写其中的determineCurrentLookupKey()方法,来实现数据源的切换。

public class DynamicDataSource extends AbstractRoutingDataSource {
    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
        System.out.println("加载动态数据源...");
        super.setDefaultTargetDataSource(defaultTargetDataSource);
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
     * 重写determineCurrentLookupKey()方法
     * @return
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDataSourceType();

八、操作数据源类

封装一个的对动态数据源进行操作的类:

* 数据源切换处理 * @Date 2021年05月20日10:07:21 * @author LiuShihao * 封装一个的对数据源进行操作的类 DynamicDataSourceContextHolder @Slf4j public class DynamicDataSourceContextHolder { * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>(); * 设置数据源的变量 * 设置当前线程的线程局部变量的值。 public static void setDataSourceType(String dsType) { log.info("切换到{}数据源", dsType); CONTEXT_HOLDER.set(dsType); * 返回当前线程所对应的线程局部变量。 * 获得数据源的变量 public static String getDataSourceType() { return CONTEXT_HOLDER.get(); * 清空数据源变量 * 将当前线程局部变量的值删除,目的是为了减少内存的占用, * 该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。 public static void clearDataSourceType() { CONTEXT_HOLDER.remove();

九、数据源类型枚举类

public enum DataSourceType{
    MASTER,
    SLAVE

使用流程:

  1. 在yml配置文件配置从库数据源。
  2. DataSourceType类添加数据源枚举。
  3. DruidConfig配置读取数据源。
  4. DruidConfigdataSource方法添加数据源。
  5. 在类或者方法上添加@DataSource注解切换数据源。
@DataSource(value = DataSourceType.MASTER)
    @Override
    public List<User> findAll4() {
       return userRepository.findAll();
    @DataSource(value = DataSourceType.SLAVE)
    @Override
    public List<AsCustInfo> findAll5() {
        return asCustInfoRepository.findAll();

项目源码:https://gitee.com/L1692312138/dynamic-data-source
使用多数据源插件方式:SpringBoot多数据源配置插件dynamic-datasource-spring-boot-starter的使用

目录一、pom依赖二、yml配置文件三、自定义切换数据源注解四、定义AOP切面切换数据源五、读取Druid连接池配置六、Druid多数据源配置类七、配置动态数据源八、操作数据源类九、数据源类型枚举类总结流程解释:一、pom依赖 &lt;!-- druid连接池 --&gt; &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;druid&lt;/artifactId&gt
采用java技术构建的一个管理系统。整个开发过程首先对系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有说明。如有不会运行源代码或定制私信。
采用java技术构建的一个管理系统。整个开发过程首先对系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果进行分析总结。 包括程序毕设程序源代码一份,数据库一份,完美运行。配置环境里面有说明。如有不会运行源代码或定制私信。
在全国电网互联和电力市场的推动下, 为了对大电网的安全、优质、经济运行和环保及效益进行协调优化, 能量管理系统(EM S) 将会有一个更大的发展, 并将成为当代大电网运行不可缺少的手段。但是, 目前国内各电网的EM S 均缺乏全方位的, 功能全面的考核监视管理系统, EM S 的管理维护和考核监视主要是由运行人员手工完成, 自动化程度较低, 可靠性、准确性也较低。EM S 应用软件的使用和系统质量还有待时间的考验, 为进一步促进EM S 应用软件基本功能的实际应用, 充分发挥其在电网安全、优质、经济运行中的作用, 并配合中国一流电网调度机构考核验收来规范和指导基本功能的验收工作, 国家电力调度通信中心制定了EM S 应用软件基本功能实用要求及验收细则[ 1 ] , 要求狠抓EM S 的实用化工作。笔者根据国调中心调自[1998 ]126号文 “关于印发《能量管理系统(EM S) 应用软件功能要求及其实施基础条件》(试行) 的通知”及其附件, 国调中心[ 1999 ]207号文“EM S 应用软件基本功能实用要求及验收细则”, 以及湖北省电力调度通信局自动化科制订的“EM S 考核监视管理系统功能规范”, 以湖北电网EM S 功能的实用化改进和考核管理为课题, 设计并建立了EM S 考核监视管理系统。 该考核监视管理系统在对EM S 应用软件的功能进行实用化改进的基础上, 可以对EM S 应用软件的运行状态及结果进行实时监视和控制, 自动计算及生成EM S 运行考核指标和报表。该考核监视管理系统可以显著地减少运行人员的分析计算工作量, 把运行人员从大量复杂、烦琐的数据检索和计算工作中解放出来, 提高了工作效率和准确性。通过对 EM S 各运行模块的监视和控制, 有效地改善了 EM S 的运行性能。该系统还可以将EM S 的实时运行状态, 中间计算信息及计算结果在Internet 网络上发布, 实现系统的无人值守及远程监控和故障诊断, 具有实用价值。该系统的研制成功为EM S 的实用化打下了坚实的基础, 充分发挥EM S 在电网安全、优质、经济运行中的作用。 2 EMS 考核监视管理系统原理和结构 考核监视管理系统硬件主要包括考核监视计算机、网络适配器和激光报表打印机等。其硬件配置如图1所示。考核监视计算机通过双网分别与EM S 和管理信息系统(M IS) 相连, 其中一个网出现故障时, 不影响系统的正常运行, 即具备双网切换能力。 图1 EMS 考核管理系统的硬件结构 Fig. 1 Hardwares for superv isory con trol system of EMS 考核监视管理系统软件包括EM S 自动考核监视软件、考核指标统计管理软件和网上信息发布系统三部分。其流程图如图2所示。 考核监视管理系统从EM S 获取有关实时数据和运行状态信息, 通过标准网络数据通信接口, 将这些实时数据和运行状态信息传送到EM S 自动考核监视管理计算机。通过数据格式转换软件, 在本地机上建立考核管理系统专用实时数据库, 并完成数据的计算、统计、分析和处理, 生成报表、曲线等考核监视结果, 刷新考核管理系统本地实时数据库。将数据与管理信息系统(M IS) 共享, 在网上发布相关信息, 并根据需要发信给电子值班员。 图2 EMS 考核管理监视系统原理框图 Fig. 2 Block diagram of superv isory con trol system of EMS 流程图的第一步是在EM S 上完成必须的源程序修改和程序编制, 这是专门针对湖北EM S 系统 (ABB S. P. I. D. E. R 系统) 设计的。因为某些EM S 考核指标的统计信息在现有湖北电网EM S 的运行状况和输出条件下是无法得到的。为此, 针对EM S 源程序进行了修改和扩充。增加了EM S 的控制参数的设定和计算结果的输出。 3 系统主要功能 EM S 考核监视管理系统有如下具体功能: 3. 1 EMS 计算数据的实时监视 3. 1. 1 母线平衡监视 计算厂站母线进出线路、变压器的有功功率和无功功率实时数据的代数值和净值。并将净值和门槛值进行比较, 筛选出母线不平衡的站。用排序方式, 按净值的偏差大小显示各厂站的站名、净值及其所属的量测分量。正常厂站用绿色显示; 净值偏差超过基准值的3. 0% 时, 用黄色显示; 净值偏差超过基准值的5. 0% 时, 则用红色显示。同时可用曲线方式分别显示各厂站的净值偏差。曲线密度为每个实时数据库数据刷新周期(目前定为1 m in) 1个点, 保存时间为3天, 曲线横纵坐标可在线修改。并监视净值更新情况, 若净值连续超过30 m in 不更新, 则可认为该路RTU 停运, 记录该路RTU 停运和恢
datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: url: jdbc:mysql://localhost:.
<h3>回答1:</h3><br/>Spring Boot可以通过配置多个数据源来实现多数据源的支持。具体步骤如下: 1. 在pom.xml中添加多数据源的依赖,如Druid、MyBatis等。 2. 在application.properties或application.yml中配置多个数据源的相关信息,如url、username、password等。 3. 创建多个数据源的配置类,分别配置不同的数据源。 4. 在需要使用数据源的地方,使用@Qualifier注解指定要使用的数据源。 5. 在需要使用事务的地方,使用@Transactional注解指定要使用的数据源。 6. 在需要使用多数据源的地方,使用@Primary注解指定默认数据源。 以上就是Spring Boot配置多数据源的基本步骤。具体实现可以参考相关的教程和示例代码。 <h3>回答2:</h3><br/>在Spring Boot框架中配置多数据源需要使用到JPA(Java Persistence API)和hibernate框架。Spring Boot框架默认使用的是单数据源,如果需要使用多数据源,则需要进行相关配置。 1.在pom.xml中引入相关依赖 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 第二个数据源所需依赖 --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.14.Final</version> </dependency> 2.在配置文件中配置多数据源 ```properties #第一个数据源配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/springboot?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=123456 #第二个数据源配置 spring.second-datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.second-datasource.url=jdbc:mysql://192.168.1.101:3306/db2?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true spring.second-datasource.username=root spring.second-datasource.password=123456 3.创建第二个数据源的配置类,并添加@Primary注解 ```java @Configuration @EnableJpaRepositories(basePackages = "com.example.demo2",entityManagerFactoryRef = "secondEntityManagerFactory",transactionManagerRef = "secondTransactionManager") public class SecondDataSourceConfig { @Bean(name = "secondDataSource") @ConfigurationProperties(prefix = "spring.second-datasource") @Primary public DataSource dataSource() { return DataSourceBuilder.create().build(); @Bean(name = "secondEntityManagerFactory") @Primary public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("secondDataSource") DataSource dataSource) { return builder.dataSource(dataSource).packages("com.example.demo2").persistenceUnit("second").build(); @Bean(name = "secondTransactionManager") @Primary public PlatformTransactionManager transactionManager(@Qualifier("secondEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); 4.在代码中使用多个EntityManager ```java @Autowired @Qualifier("entityManagerFactory") private EntityManagerFactory primaryEntityManagerFactory; @Autowired @Qualifier("secondEntityManagerFactory") private EntityManagerFactory secondEntityManagerFactory; public void test() { EntityManager entityManager = primaryEntityManagerFactory.createEntityManager(); EntityManager entityManager2 = secondEntityManagerFactory.createEntityManager(); 以上就是Spring Boot框架如何配置多数据源的全部步骤。多数据源能够实现不同的数据库间的数据交互,比如读写分离,提高系统的稳定性和性能。但同时也需要更多的开发与维护工作,开发人员需要根据实际需要进行选择。 <h3>回答3:</h3><br/>Spring Boot是一个非常流行的Java框架,可以帮助我们快速开发应用程序。Spring Boot通过内置的简化配置方式使得开发过程变得更加容易和快捷。在Spring Boot中,配置多数据源是一个重要的任务,本文将详细介绍如何配置多数据源。 首先,我们需要在application.properties 文件中,配置数据源的连接信息。下面是一个简单的应用程序的数据源配置示例: ## 默认数据源 spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ## 第二个数据源 spring.datasource.second.url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 spring.datasource.second.username=root spring.datasource.second.password=123456 spring.datasource.second.driver-class-name=com.mysql.cj.jdbc.Driver 其次,我们需要创建多个数据源,并使用@Qualifier注释将其注入到Spring中。我们可以使用@Configuration注解来创建多数据源配置类: @Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); @Bean(name = "secondDataSource") @Qualifier("secondDataSource") @ConfigurationProperties(prefix = "spring.datasource.second") public DataSource secondDataSource() { return DataSourceBuilder.create().build(); 在上面的代码段中,我们创建了两个不同的数据源:primaryDataSource和secondDataSource。我们使用@ConfigurationProperties配置信息来创建数据源并注入它们。 最后,我们需要配置JdbcTemplate访问多个数据源。在Spring Boot中,我们可以使用JdbcTemplate访问多个数据源,这个非常方便: @SpringBootTest class SpringbootDemoApplicationTests { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired @Qualifier("secondDataSource") private DataSource secondDataSource; @Autowired @Qualifier("primaryDataSource") private JdbcTemplate primaryJdbcTemplate; @Autowired @Qualifier("secondDataSource") private JdbcTemplate secondJdbcTemplate; @Test void test() { String sql = "select count(*) from user"; Long count1 = primaryJdbcTemplate.queryForObject(sql, Long.class); Long count2 = secondJdbcTemplate.queryForObject(sql, Long.class); System.out.println("primaryDataSource: " + primaryDataSource.getClass()); System.out.println("secondDataSource: " + secondDataSource.getClass()); System.out.println("count1: " + count1); System.out.println("count2: " + count2); 在上面的代码片段中,我们注入了primaryDataSource和secondDataSource数据源,并通过它们创建了primaryJdbcTemplate和secondJdbcTemplate。我们可以在测试方法中,使用primaryJdbcTemplate和secondJdbcTemplate来查询多个数据源,并打印出相应的结果。 本文介绍了如何在Spring Boot配置多数据源。我们需要在application.properties文件中配置每个数据源的连接信息,并使用@Configuration中@Bean注入多个数据源。然后,我们可以使用JdbcTemplate访问多个数据源。
一定要坚持创作更多高质量博客哦, 小小红包, 以资鼓励, 更多创作活动请看: 新星计划2023: https://marketing.csdn.net/p/1738cda78d47b2ebb920916aab7c3584?utm_source=csdn_ai_ada_redpacket 新星计划2023: https://marketing.csdn.net/p/1738cda78d47b2ebb920916aab7c3584?utm_source=csdn_ai_ada_redpacket 上传ChatGPT/计算机论文等资源,瓜分¥5000元现金: https://blog.csdn.net/VIP_Assistant/article/details/130196121?utm_source=csdn_ai_ada_redpacket 新人首创任务挑战赛: https://marketing.csdn.net/p/90a06697f3eae83aabea1e150f5be8a5?utm_source=csdn_ai_ada_redpacket Microsoft Edge功能测评!: https://activity.csdn.net/creatActivity?id=10403?utm_source=csdn_ai_ada_redpacket 职场解惑讨论会: https://activity.csdn.net/creatActivity?id=10427?utm_source=csdn_ai_ada_redpacket 可持续能源技术真的能改变世界吗?: https://activity.csdn.net/creatActivity?id=10425?utm_source=csdn_ai_ada_redpacket 无效数据,你会怎么处理?: https://activity.csdn.net/creatActivity?id=10423?utm_source=csdn_ai_ada_redpacket 物联网技术正在如何影响我们的生活: https://activity.csdn.net/creatActivity?id=10421?utm_source=csdn_ai_ada_redpacket 生物识别技术能否成为应对安全挑战的绝佳选择?: https://activity.csdn.net/creatActivity?id=10411?utm_source=csdn_ai_ada_redpacket 应届生如何提高职场竞争力: https://activity.csdn.net/creatActivity?id=10409?utm_source=csdn_ai_ada_redpacket 讯飞星火大模型将超越chatgpt?: https://activity.csdn.net/creatActivity?id=10407?utm_source=csdn_ai_ada_redpacket 职场新人备忘录: https://activity.csdn.net/creatActivity?id=10405?utm_source=csdn_ai_ada_redpacket VR vs AR:哪种技术更有潜力改变未来?: https://activity.csdn.net/creatActivity?id=10399?utm_source=csdn_ai_ada_redpacket “裸奔”时代下该如何保护网络隐私: https://activity.csdn.net/creatActivity?id=10401?utm_source=csdn_ai_ada_redpacket 蓝桥杯备赛指南分享: https://activity.csdn.net/creatActivity?id=10317?utm_source=csdn_ai_ada_redpacket