`
QING____
  • 浏览: 2253250 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SpringBoot多数据源配置

    博客分类:
  • JAVA
 
阅读更多

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

 

分享到:
评论

相关推荐

    springboot多数据源配置

    在Spring Boot应用中,多数据源配置是一项重要的技术实践,特别是在大型系统中,可能需要连接到多个数据库以实现数据隔离、读写分离或是分布式事务管理。Spring Boot以其强大的自动化配置能力,使得设置多数据源变得...

    springboot多数据源配置(sqlserver,mysql)

    在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们连接并操作多个数据库,例如MySQL和SQL Server。在本场景中,我们将探讨如何在Spring Boot中设置和管理这样的多数据源配置。 首先,我们需要了解`...

    SpringBoot配置多数据源实现动态切换数据源

    多数据源配置允许我们灵活地管理这些数据。 SpringBoot实现多数据源主要依靠Spring的`@Configuration`和`@DataSourceConfiguration`注解,以及Spring JDBC的`DataSource`接口。下面是一个基本的配置示例: ```java...

    SpringBoot+gradle+mybatis多数据源动态配置

    本项目结合了SpringBoot、Gradle和MyBatis,旨在实现多数据源的动态配置,这对于处理多个数据库或者分库分表的场景尤其有用。以下是对这个项目的详细解析: **SpringBoot** SpringBoot是由Pivotal团队提供的全新...

    SpringBoot多数据源案例

    你需要为每个数据源配置一个事务管理器,并确保在事务开始时选择正确的数据源。 6. **测试与实践**: 为了验证多数据源的配置是否正确,可以编写单元测试或集成测试,模拟对两个数据源的增删改查操作,确保数据被...

    springboot 多数据源

    在多数据源场景下,我们需要配置多个DataSource,以便在不同的业务场景下选择合适的数据源进行操作。 1. **配置多数据源**: 在Spring Boot中,我们可以利用`@ConfigurationProperties`注解来绑定YAML或properties...

    springboot多数据源即分布式事务解决方案

    SpringBoot作为一款轻量级的框架,提供了便捷的多数据源配置和分布式事务管理方案,使得开发者能够高效地管理和操作不同的数据库。本文将详细探讨SpringBoot如何实现多数据源以及分布式事务。 首先,我们要理解什么...

    MultiDataSource:SpringBoot多数据源配置

    本篇文章将详细解析如何在SpringBoot中实现多数据源配置,以及相关的知识点。 首先,我们需要了解什么是多数据源。多数据源是指在一个应用程序中同时连接和操作多个不同的数据库。在SpringBoot中,我们可以利用...

    SpringBoot多数据源框架【整合配置及应用】.docx

    在 SpringBoot 中,我们可以使用 `spring.datasource` 配置数据源参数,其中包括了多数据源配置。 ``` spring: datasource: dynamic: primary: master datasource: master: driver-class-name: org.sqlite....

    springboot多数据源整合

    1. **数据源配置**:在Spring Boot中,我们可以通过`application.yml`或`application.properties`文件来配置多个数据源。每个数据源需要指定相应的数据库连接信息,包括URL、用户名、密码以及驱动类名。例如: ```...

    springboot多数据源即分布式事务解决方案,添加对多线程的支持

    1. 数据源配置:包含不同数据源的配置文件,如上面提到的`application.yml`。 2. 事务管理器配置:定义并配置了多数据源对应的事务管理器。 3. 业务逻辑层:使用`@Transactional`注解标记事务边界,可能还使用了`@...

    SpringBoot多数据源成果源代码.rar

    综上所述,"SpringBoot多数据源成果源代码"项目提供了Spring Boot环境下多数据源配置和应用的实践经验,对于理解和掌握这一技术有极大的帮助。通过深入研究源代码,开发者可以学到如何在实际项目中灵活地管理和使用...

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务。一个基于springboot的快速集成多数据源的启动器。支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库...

    SpringBoot 多数据源

    1. **配置多数据源**:在SpringBoot中,我们可以使用`@ConfigurationProperties`注解来自定义数据源配置。例如,为两个数据库分别配置名为`primary`和`secondary`的数据源: ```java @Configuration @...

    springboot多数据源demo

    综上所述,"springboot多数据源demo"项目涵盖了Spring Boot中实现多数据源的关键步骤,包括数据源配置、JdbcTemplate或JPA的创建、事务管理以及数据源的动态切换。这个示例对于学习和实践Spring Boot的多数据源处理...

    springboot+mybatis多数据源+动态数据源配置(连接池)

    springboot+mybatis多数据源+动态数据源配置(连接池),mysql数据库,代码实现了简单的读写分离,但是不建议这种操作,建议使用数据库中间件进行读写分离,例如使用mycat进行读写分离主从热备,使用该代码对于多个...

    springboot多数据源代码

    4. **配置事务管理器**:因为每个数据源可能有自己的事务管理策略,所以需要为每个数据源配置相应的PlatformTransactionManager。如果两个数据源的事务处理方式不同,可能需要分别处理。 5. **数据库操作**:在业务...

    springboot实现多数据源而且加上事务不会使aop切换数据源失效

    首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两个不同的数据源。在`application.properties`或`application.yml`中,为每个数据源定义不同的...

    springboot多数据源,DruidDataSource多数据源切换,不重启项目,修改数据库名解决方案

    项目背景: 1. Springboot项目 ... 一个主数据源,数据名称库不变。 3. 一个副数据源,数据库名称每天都在变,比如今天1号,是db_01; 明天2号,是db_02。 4.不重启项目切换数据源。 5.项目介绍: ...

    SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver)手动切换示例代码

    SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver)手动切换示例代码 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135701561

Global site tag (gtag.js) - Google Analytics