Springboot单个数据源比较容易配置,它自动装配特性支持下,DataSource的初始化和注入等比较便捷。但是在多数据源情况下,反而有些蹩脚;其实实施起来也不算太复杂,方式也比较多。本文展示一个比较易用的方式,仅供参考。
我们假定有2个数据源,dataSource1和dataSource2,基于tomcat-jdbc连接池,粗略配置如下文所示,部分属性可以自行按需增加。
1、application.properties
################# dataSource #################### datasource: default: url: jdbc:mysql://127.0.0.1:3306/test?autoReconnect=false username: root password: root maxActive: 32 maxIdle: 4 minIdle: 1 defaultAutoCommit: true maxAge: 60000 testOnBorrow: true testOnReturn: true validationQuery: SELECT 1 db0: url: jdbc:mysql://127.0.0.1:3306/test0?autoReconnect=false username: root password: root maxActive: 32 maxIdle: 4 minIdle: 1 defaultAutoCommit: true maxAge: 60000 testOnBorrow: true testOnReturn: true validationQuery: SELECT 1 db1: url: jdbc:mysql://127.0.0.1:3306/test1?autoReconnect=false username: root password: root maxActive: 32 maxIdle: 4 minIdle: 1 defaultAutoCommit: true maxAge: 60000 testOnBorrow: true testOnReturn: true validationQuery: SELECT 1
2、Application.java
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @MapperScan("com.vipkid.sample.dao") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @ConfigurationProperties(prefix = "datasource.default") @Bean("defaultDataSource") public DataSource defaultDataSource() { return DataSourceBuilder.create().build(); } @ConfigurationProperties(prefix = "datasource.db0") @Bean(value = "dataSource0") public DataSource dataSource0() { return DataSourceBuilder.create().build(); } @ConfigurationProperties(prefix = "datasource.db1") @Bean(value = "dataSource1") public DataSource dataSource1() { return DataSourceBuilder.create().build(); } }
原理比较简单,对于Spring容器而言,在Bean初始化之前(Spring Bean可以被export之前,并非Bean实例创建之前),可以执行已注册的“postProcessor”来完成一些特定操作。对于SpringBoot环境,如果@Bean被@ConfigurationProperties修饰,那么将会在Bean初始化之前通过"ConfigurationPropertiesBindingPostProcessor"执行一些属性设置操作:根据ConfigurationProperties.prefix通过匹配获得有效的properties列表,依次通过反射机制(内部有复杂的转换)获取同名property的setter方法并执行;最终目的就是将@ConfigurationProperties中限定的属性列表与@Bean实例同名属性进行赋值。
以“defaultDataSource”为例:
1)DataSource defaultDataSource()方法内部,就是尝试加载指定的一些dataSource类型,如classpath中存在则创建相应的DataSource实例。比如我们引入了tomcat-jdbc依赖,那么将会加载“org.apache.tomcat.jdbc.pool.DataSource”并创建其实例。当然你可以强制指定:
return DataSourceBuilder.create() .type(org.apache.tomcat.jdbc.pool.DataSource.class) .build();
此方法返回dataSource实例,但是此实例并没有任何我们所需要的属性。即此时@ConfugurationProperties注释还没有发挥实际作用,只是@Bean部分执行完毕。
2)根据Spring Bean原理,@Bean在export之前,需要执行一些postProcessor;那么在SpringBoot环境下,被@ConfigurationProperties修饰的Bean,需要执行ConfigurationPropertiesBindingPostProcessor,那么在yml中申明的属性才会被bind到DataSource实例中;比如“url”、“maxActive”等等。内部主要是PropertiesConfigurationFactory在发挥作用,将prefix传递给此Factory,此Factory将会从全局的properties列表中匹配符合prefix的属性列表(会准守springboot properties规范,比较将大写与“-”转化等),并对属性依次构建“DataSource”实例的setter方法(反射机制Method),然后执行。
(源码参见,ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(Object bean,String beanName),其中bean为dataSource实例,beanName为“defaultDataSource”)
3)此外,为了避免与SpringBoot默认的dataSource装配冲突,我们需要禁用内置的DataSourceAutoConfiguration:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
相关推荐
在Spring Boot应用中,多数据源配置是一项重要的技术实践,特别是在大型系统中,可能需要连接到多个数据库以实现数据隔离、读写分离或是分布式事务管理。Spring Boot以其强大的自动化配置能力,使得设置多数据源变得...
在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们连接并操作多个数据库,例如MySQL和SQL Server。在本场景中,我们将探讨如何在Spring Boot中设置和管理这样的多数据源配置。 首先,我们需要了解`...
多数据源配置允许我们灵活地管理这些数据。 SpringBoot实现多数据源主要依靠Spring的`@Configuration`和`@DataSourceConfiguration`注解,以及Spring JDBC的`DataSource`接口。下面是一个基本的配置示例: ```java...
本项目结合了SpringBoot、Gradle和MyBatis,旨在实现多数据源的动态配置,这对于处理多个数据库或者分库分表的场景尤其有用。以下是对这个项目的详细解析: **SpringBoot** SpringBoot是由Pivotal团队提供的全新...
你需要为每个数据源配置一个事务管理器,并确保在事务开始时选择正确的数据源。 6. **测试与实践**: 为了验证多数据源的配置是否正确,可以编写单元测试或集成测试,模拟对两个数据源的增删改查操作,确保数据被...
在多数据源场景下,我们需要配置多个DataSource,以便在不同的业务场景下选择合适的数据源进行操作。 1. **配置多数据源**: 在Spring Boot中,我们可以利用`@ConfigurationProperties`注解来绑定YAML或properties...
SpringBoot作为一款轻量级的框架,提供了便捷的多数据源配置和分布式事务管理方案,使得开发者能够高效地管理和操作不同的数据库。本文将详细探讨SpringBoot如何实现多数据源以及分布式事务。 首先,我们要理解什么...
本篇文章将详细解析如何在SpringBoot中实现多数据源配置,以及相关的知识点。 首先,我们需要了解什么是多数据源。多数据源是指在一个应用程序中同时连接和操作多个不同的数据库。在SpringBoot中,我们可以利用...
在 SpringBoot 中,我们可以使用 `spring.datasource` 配置数据源参数,其中包括了多数据源配置。 ``` spring: datasource: dynamic: primary: master datasource: master: driver-class-name: org.sqlite....
1. **数据源配置**:在Spring Boot中,我们可以通过`application.yml`或`application.properties`文件来配置多个数据源。每个数据源需要指定相应的数据库连接信息,包括URL、用户名、密码以及驱动类名。例如: ```...
1. 数据源配置:包含不同数据源的配置文件,如上面提到的`application.yml`。 2. 事务管理器配置:定义并配置了多数据源对应的事务管理器。 3. 业务逻辑层:使用`@Transactional`注解标记事务边界,可能还使用了`@...
综上所述,"SpringBoot多数据源成果源代码"项目提供了Spring Boot环境下多数据源配置和应用的实践经验,对于理解和掌握这一技术有极大的帮助。通过深入研究源代码,开发者可以学到如何在实际项目中灵活地管理和使用...
基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务。一个基于springboot的快速集成多数据源的启动器。支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库...
1. **配置多数据源**:在SpringBoot中,我们可以使用`@ConfigurationProperties`注解来自定义数据源配置。例如,为两个数据库分别配置名为`primary`和`secondary`的数据源: ```java @Configuration @...
综上所述,"springboot多数据源demo"项目涵盖了Spring Boot中实现多数据源的关键步骤,包括数据源配置、JdbcTemplate或JPA的创建、事务管理以及数据源的动态切换。这个示例对于学习和实践Spring Boot的多数据源处理...
springboot+mybatis多数据源+动态数据源配置(连接池),mysql数据库,代码实现了简单的读写分离,但是不建议这种操作,建议使用数据库中间件进行读写分离,例如使用mycat进行读写分离主从热备,使用该代码对于多个...
4. **配置事务管理器**:因为每个数据源可能有自己的事务管理策略,所以需要为每个数据源配置相应的PlatformTransactionManager。如果两个数据源的事务处理方式不同,可能需要分别处理。 5. **数据库操作**:在业务...
首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两个不同的数据源。在`application.properties`或`application.yml`中,为每个数据源定义不同的...
项目背景: 1. Springboot项目 ... 一个主数据源,数据名称库不变。 3. 一个副数据源,数据库名称每天都在变,比如今天1号,是db_01; 明天2号,是db_02。 4.不重启项目切换数据源。 5.项目介绍: ...
SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver)手动切换示例代码 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135701561