springboot集成dynamic使用@DS实现多数据源问题

 更新时间:2026年06月10日 08:38:06   作者:疯狂小野码  
这段文章主要介绍了Spring Boot多数据源配置及使用Seata进行分布式事务管理的方法,并强调了配置细节的重要性,包括排除特定自动配置、正确配置数据源、处理事务管理及排除相关jar包版本问题等

首先

在pom文件导入依赖

<dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
     <version>2.5.4</version>
</dependency>

修改配置文件

配置文件信息

如下

server:
  port: 8087
#  设置tomcat的post请求大小为无限制
  tomcat:
    max-http-form-post-size: -1
spring:
#  设置日期格式
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
#  设置请求大小为无限制
  servlet:
    multipart:
      max-file-size: -1
      max-request-size: -1
  datasource:
    dynamic:
      primary: model
      datasource:
        model:
          url: jdbc:kingbase8:
          driver-class-name: com.kingbase8.Driver
          username: 
          password: 
        plan:
          url: jdbc:kingbase8:
          driver-class-name: com.kingbase8.Driver
          username: 
          password: 
        project:
          url: jdbc:kingbase8:
          driver-class-name: com.kingbase8.Driver
          username: 
          password: 
  jpa:
    open-in-view: false
    #    是否在控制台展示sql
    show-sql: true
    #    如果实体类中添加新字段,或者没有表 创建新的表
    hibernate:
      ddl-auto: none
    properties:
      #     hibernate方言:就是对应数据库,在根据对应的数据库进行自动实现sql
      hibernate.dialect: org.hibernate.dialect.Kingbase8Dialect
mybatis:
  mapper-locations: classpath*:mybatis/*Mapper.xml
##配置分页插件pagehelper
pagehelper:
  #heleperDialect表示配置PageHelper的方言,一般取值为mysql、oracle
  helperDialect: mysql
  #reasonable表示分页合理化参数,其取值默认为false,会直接根据分页参数(PageNum、PageSize)进行查询。当该参数设置为true时,pageNum小于等于0时会查询第一页,pageNum>pages(超过总数时),会查询最后一页
  reasonable: true
  #supportMethodsArguments表示PageHelper是否支持根据mapper方法的入参对象(queryModel)的pageNum、pageSize 来分析是否进行自动分页,默认为false(推荐配置),为true的情况下一不留神会给自己带来坑,除非我们的入参对象(queryModel)中不含这两个字段
  supportMethodsArguments: false
  #为了支持PageHelper的startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
  params: count=countSql
#swagger配置
springfox:
  documentation:
    swagger:
      use-model-v3: false

其中配置了三个数据源,其中选择model作为默认数据源(对应primary配置);

 启动类如下

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@MapperScan(basePackages = "com.cnooc.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

要在@SpringBootApplication注解中把DataSourceAutoConfiguration.class排除

最后使用@DS

使用@DS在service的实现类上、方法上

使用@DS在mapper的类上、方法上进行使用

其中在类上使用代表,整个实现类的数据源指向某一个,在方法上使用时,代表这个方法的数据源指向某一个

示例:

遇到问题

配置好之后,进行项目启动时,报了如下错误

 这是因为在pom文件中没有把jdbc或者mybatis的jar包注掉,注掉即可。

补充:

事务管理:

在多数据源场景下,事务管理需要特别注意。默认情况下,Spring 的事务管理器只能管理一个数据源。如果需要跨数据源事务,可以使用分布式事务解决方案(如 Seata)。需要在项目中引入 seata-spring-boot-starter 依赖。并在配置文件中进行相关配置。在方法上添加 @GlobalTransactional 注解来开启全局事务。

  • 单数据源,使用@Transactional
  • 多数据源,可以使用@DSTransactional注解(从版本3.3.0之后才可以使用这个注解)

再次补充

因为引入的jar报是2.5.4,配置多数据源时,一定要加driver-class-name,不然启动会报错

driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置

另外还可以换成springboot3的jar包

<!-- https://mvnrepository.com/artifact/com.baomidou/dynamic-datasource-spring-boot3-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
    <version>4.1.3</version>
</dependency>

再再次补充:

想在两个不同数据源的service方法中调用互相调用,则需要在对应数据源的xml文件中指定数据库名称和表名,不然会报表不存在

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解redis与spring的整合(使用缓存)

    详解redis与spring的整合(使用缓存)

    本篇文章主要介绍了redis与spring的整合(使用缓存),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java客户端通过HTTPS连接到Easysearch实现过程

    Java客户端通过HTTPS连接到Easysearch实现过程

    这篇文章主要为大家介绍了Java客户端通过HTTPS连接到Easysearch实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 在Android系统中使用WebViewClient处理跳转URL的方法

    在Android系统中使用WebViewClient处理跳转URL的方法

    这篇文章主要介绍了在Android系统中使用WebViewClient处理跳转URL的方法,实现代码为Java语言编写,是需要的朋友可以参考下
    2015-07-07
  • spring消息转换器使用详解

    spring消息转换器使用详解

    这篇文章主要为大家详细介绍了spring消息转换器的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • 超详细讲解Java异常

    超详细讲解Java异常

    Java 异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。本文超详细讲解了Java异常,感兴趣的小伙伴可以参考一下这篇文章
    2021-09-09
  • Kafka中Producer和Consumer的作用详解

    Kafka中Producer和Consumer的作用详解

    这篇文章主要介绍了Kafka中Producer和Consumer的作用详解,Kafka是一个分布式的流处理平台,它的核心是消息系统,Producer是Kafka中用来将消息发送到Broker的组件之一,它将消息发布到主题,并且负责按照指定的分区策略将消息分配到对应的分区中,需要的朋友可以参考下
    2023-12-12
  • springboot时间格式化的五种方法总结(解决后端传给前端的时间显示不一致)

    springboot时间格式化的五种方法总结(解决后端传给前端的时间显示不一致)

    这篇文章主要给大家介绍了关于springboot时间格式化的五种方法,文中介绍的方法解决了后端传给前端的时间显示不一致,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • JDK17安装教程以及其环境变量配置教程

    JDK17安装教程以及其环境变量配置教程

    环境变量对Java初学者来说真的是一件头疼的事,本人也经历过这样的事情,这篇文章主要给大家介绍了关于JDK17安装教程以及其环境变量配置的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • Spring data jpa @Query update的坑及解决

    Spring data jpa @Query update的坑及解决

    这篇文章主要介绍了Spring data jpa @Query update的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java 替换空格

    Java 替换空格

    本文主要介绍了Java中替换空格的方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论