【Spring Boot】Spring Boot整合多数据源

这篇具有很好参考价值的文章主要介绍了【Spring Boot】Spring Boot整合多数据源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在实际的开发工作中,我们经常会遇到需要整合多个数据源的情况,比如同时连接多个数据库、读写分离、跨数据库查询等。本文将介绍如何使用Spring Boot来实现多数据源的整合,对于刚刚接触开发的小伙伴可能有一些帮助。

一、基本概念

1.1 什么是多数据源?

在一个应用程序中使用多个数据源意味着我们需要在不同的数据源之间进行切换,以便从不同的数据源中获取数据。多数据源可以是关系数据库、NoSQL 数据库、平面文件、XML 文件等。在一个应用程序中使用多数据源的好处是,我们可以根据应用程序的需求选择最合适的数据源,从而提高应用程序的性能和可扩展性。

1.2 为什么要使用多数据源?

在一个应用程序中使用多数据源的好处有很多,其中一些是:

  • 可以根据应用程序的需求选择最合适的数据源,从而提高应用程序的性能和可扩展性。
  • 可以减少单一数据源所带来的风险,例如单点故障。
  • 可以更好地支持数据的隔离和数据的安全性。
  • 可以更好地支持不同的业务需求。

二、如何在 Spring Boot 中整合多数据源?

2.1 基本配置

接下来的整合示例,我将以实际项目整合示例来介绍,项目中是mysql和phoenix多数据源,那么接下来详细描述一下,因为项目中整合了MybatisPlus,所以也会有一些相关的配置,首先,我们需要在pom.xml文件中添加相应的依赖项。以下是常用的数据源依赖项:

<!-- 数据源 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL 数据库 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- phoenix 数据库 -->
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-core</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>        
</dependency>

接下来,我们需要在application.properties或application.yml文件中配置各个数据源的连接信息。以下是示例配置:

 #数据库配置
  datasource:
    #mysql数据源配置
    mysql:
      type: com.zaxxer.hikari.HikariDataSource
      jdbc-url: jdbc:p6spy:mysql://xxxx:3306/xxxx?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
      username: xxxx
      password: xxxxx
      # Hikari 连接池配置
      # 最小空闲连接数量
      hikari:
        minimum-idle: 5
        # 空闲连接存活最大时间,默认600000(10分钟)
        idle-timeout: 180000
        # 连接池最大连接数,默认是10
        maximum-pool-size: 10
        # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
        auto-commit: true
        # 连接池名称
        pool-name: xxxx-HikariCP
        # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
        max-lifetime: 1800000
        # 数据库连接超时时间,默认30秒,即30000
        connection-timeout: 30000
        connection-test-query: SELECT 1

    #phoenix数据源配置
    phoenix:
      driver: org.apache.phoenix.jdbc.PhoenixDriver
      jdbcUrl: jdbc:phoenix:xxxxx:xxxx
      user:
      password:
      connectionProperties:
      isNamespaceMappingEnabled: true
      mapSystemTablesToNamespace: true
      schema: 'xxxxxx'
      maximumPoolSize: 128
      maxLifetime: 1200000

之后,我们需要创建多个数据源的配置类,以及一些基础的配置。以下是示例代码:

@EnableTransactionManagement
@Configuration
@MapperScan("com.xxxx.mapper")
public class DataSourceConfig {

    @Autowired
    private PhoenixProperties phoenixProperties;

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor().setDialectType("mysql");
    }


    @Bean(name = "mysqlDateSource")
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public HikariDataSource mysqlDateSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    @Bean(name = "phoenixDataSource")
    public HikariDataSource phoenixDataSource() {
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setDriverClassName(phoenixProperties.getDriver());
        dataSource.setJdbcUrl(phoenixProperties.getJdbcUrl());
        dataSource.setUsername(phoenixProperties.getUser());
        dataSource.setPassword(phoenixProperties.getPassword());
        Properties properties = new Properties();
        properties.setProperty("phoenix.schema.isNamespaceMappingEnabled", phoenixProperties.getIsNamespaceMappingEnabled());
        properties.setProperty("phoenix.schema.mapSystemTablesToNamespace", phoenixProperties.getMapSystemTablesToNamespace());
        properties.setProperty("schema", phoenixProperties.getSchema());
        properties.setProperty("maximum-pool-size", phoenixProperties.getMaximumPoolSize());
        properties.setProperty("max-lifetime", phoenixProperties.getMaxLifetime());
        dataSource.setDataSourceProperties(properties);
        return dataSource;
    }

    /**
     * 动态数据源配置
     *
     * @return DataSource
     */
    @Bean
    @Primary
    public DataSource multipleDataSource(@Qualifier("mysqlDateSource") DataSource mysqlDateSource, @Qualifier("phoenixDataSource") DataSource phoenixDataSource) {
        MultipleDataSource multipleDataSource = new MultipleDataSource();
        Map<Object, Object> targetDataSources = Maps.newHashMap();
        targetDataSources.put(DataSourceEnum.MYSQL.getValue(), mysqlDateSource);
        targetDataSources.put(DataSourceEnum.PHOENIX.getValue(), phoenixDataSource);
        //添加数据源
        multipleDataSource.setTargetDataSources(targetDataSources);
        //设置默认数据源
        multipleDataSource.setDefaultTargetDataSource(mysqlDateSource);
        return multipleDataSource;
    }

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(multipleDataSource(mysqlDateSource(), phoenixDataSource()));
        ResourceLoader loader = new DefaultResourceLoader();
        String resource = "classpath:mybatis-config.xml";
        sqlSessionFactory.setConfigLocation(loader.getResource(resource));
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactory.setMapperLocations(resolver.getResources("classpath*:/mapper/*.xml"));
        sqlSessionFactory.setTypeAliasesPackage("com.huitongjy.oms.web.entity");
        sqlSessionFactory.setTypeEnumsPackage("com.huitongjy.oms.common.enums");
        //关键代码 设置 MyBatis-Plus 分页插件
        Interceptor[] plugins = {paginationInterceptor()};
        sqlSessionFactory.setPlugins(plugins);
        return sqlSessionFactory.getObject();
    }

}

MultipleDataSource类

public class MultipleDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSource();
    }
}

class DataSourceContextHolder {

    private static final ThreadLocal<String> CONTEXT_HOLDER = new InheritableThreadLocal<>();

    /**
     * 设置数据源
     *
     * @param db String
     */
    static void setDataSource(String db) {
        CONTEXT_HOLDER.set(db);
    }

    /**
     * 取得当前数据源
     *
     * @return String
     */
    static String getDataSource() {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 清除上下文数据
     */
    static void clear() {
        CONTEXT_HOLDER.remove();
    }
}

mybatis-config.xml的配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
    <setting name="cacheEnabled" value="false"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="multipleResultSetsEnabled" value="true"/>
    <setting name="useColumnLabel" value="true"/>
    <setting name="useGeneratedKeys" value="false"/>
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <setting name="defaultStatementTimeout" value="25"/>
    <setting name="defaultFetchSize" value="100"/>
    <setting name="safeRowBoundsEnabled" value="false"/>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <setting name="localCacheScope" value="SESSION"/>
    <setting name="jdbcTypeForNull" value="OTHER"/>
    <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
  </settings>
</configuration>

在上面的代码中,我们使用 @ConfigurationProperties(prefix = “spring.datasource.mysql”) 将配置文件中的属性绑定到 mysql 的 HikariDataSource 对象上。同样地,我们也为 phoenixDataSource 进行绑定。
这两个数据源分别连接不同的数据库。@Primary注解表示主要的数据源,用于在运行时决定使用哪个数据源。我们创建了一个名为multipleDataSource的方法,该方法添加数据源,并且设置好默认的数据源,
最后,在SqlSessionFactory加载多数据源,以及一些配置文件,这样就可以管理和配置数据库连接。

2.2 项目代码

配置完之后,我们只需要在phoenix接口上配置一下数据源即可,代码如下:

public interface TestDetailMapper {

    /**
     * 保存
     * @param testDetail
     */
    @DataSource(DataSourceEnum.PHOENIX)
    @Insert(" upsert into xxx_xxx (xxxxx) " +
        " values (#{xxxx})")
    void insert(@Param("xxx") TestDetail testDetail);


    /**
     * 获取内容
     *
     * @param xxxx
     * @return xxx
     */
    @Results(value = {
        @Result(property = "xxxx", column = "xxxxx")
    })
    @DataSource(DataSourceEnum.PHOENIX)
    @Select("SELECT XXXX FROM XXX WHERE XXX=#{XXXX}")
    TestDetail findByKey(@Param("XXXX") String XXXX);

}

通过上述代码,我们已经成功实现了多数据源的整合。

2.3 注意事项

(1)必须指定主数据源,就是在主数据源的bean注入上加一个@Primary注解,表示同一个类的多个对象注入,优先选择有注解@Primary的对象。
(2)不同数据源的dao和mapper文件最好分开到不同包路径和文件路径下,这样才能单独的配置文件映射,不然会出错。文章来源地址https://www.toymoban.com/news/detail-684521.html

到了这里,关于【Spring Boot】Spring Boot整合多数据源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 配置双数据源

    Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denpendies. 需求: 1.基本步骤 添加依赖 添加 Spring Boot 和数据库驱动的依赖 配置数据源 在 application.properties 或 application.yml 中分别配

    2024年01月22日
    浏览(61)
  • 【Spring Boot 3】【数据源】自定义JPA数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月21日
    浏览(69)
  • 【Spring Boot 3】【数据源】自定义JDBC多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月23日
    浏览(49)
  • 【Spring Boot 3】【数据源】自定义JPA多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月22日
    浏览(80)
  • 实例讲解Spring boot动态切换数据源

    摘要: 本文模拟一下在主库查询订单信息查询不到的时候,切换数据源去历史库里面查询。 本文分享自华为云社区《springboot动态切换数据源》,作者:小陈没烦恼 。 在公司的系统里,由于数据量较大,所以配置了多个数据源,它会根据用户所在的地区去查询那一个数据库

    2024年02月06日
    浏览(43)
  • Spring Boot配置多个Kafka数据源

    application.properties配置文件如下 1.第一个kakfa 2.第二个kakfa 备注: 生产者消费者代码参考链接,开发同学需要以实际情况按要求自己变更下代码即可: Spring Boot 集成多个 Kafka_springboot集成多个kafka_//承续缘_纪录片的博客-CSDN博客

    2024年02月07日
    浏览(73)
  • 【Java】Spring Boot配置动态数据源

    1.1 创建动态数据源 通过实现Spring提供的AbstractRoutingDataSource类,可以实现自己的数据源选择逻辑,从而可以实现数据源的动态切换。 1.2 创建动态数据源配置类 跟配置静态多数据源一样,需要手动配置下面的三个 Bean,只不过DynamicDataSource类的targetDataSources是空的。 1.3 创建动

    2024年02月09日
    浏览(51)
  • 如何在Spring Boot中配置双数据源?

    在许多应用程序中, 可能会遇到需要连接多个数据库的情况 。这些数据库可以是不同的类型,例如关系型数据库和NoSQL数据库,或者它们可以是相同类型但包含不同的数据。为了处理这种情况,我们可以使用双数据源来管理多个数据库连接。 双数据源是指在一个应用程序中

    2024年02月11日
    浏览(47)
  • Spring Boot 多数据源及事务解决方案

    一个主库和N个应用库的数据源,并且会同时操作主库和应用库的数据,需要解决以下两个问题: 如何动态管理多个数据源以及切换? 如何保证多数据源场景下的数据一致性(事务)? 本文主要探讨这两个问题的解决方案,希望能对读者有一定的启发。 通过扩展Spring提供的抽象

    2024年02月10日
    浏览(36)
  • Spring Boot多数据源事务@DSTransactional的使用

    Spring Boot 集成com.baomidou,引入dynamic-datasource依赖,实现多数据源,这里说下事务问题: 1、一个方法中使用同一个数据源; 2、一个方法中使用了多个数据源; 这里把dao、service列出来 1、dao层   2、service层  spring boot实现多数据源:Spring Boot集成Druid实现多数据源的两种方式_涛

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包