Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在类方法上加了@DS注解后,不管类和方法上的@DS注解指向哪个数据源,都会导致读取的始终是默认的数据源 #375

Closed
chengwengao opened this issue May 25, 2021 · 11 comments

Comments

@chengwengao
Copy link

Enviroment

JDK Version(required): JDK1.8

SpringBoot Version(required): org.springframework.boot:spring-boot-starter-webflux:2.1.9.RELEASE

dynamic-datasource-spring-boot-starter Version(required): 3.3.2

druid Version(optional): 1.1.21

Describe what happened

在类和方法上都使用了@ds注解,经过测试发现只要在类上加入了该注解,不管类上的注解是@ds("master")还是@ds("slave"),方法上的@ds是啥,都会导致方法执行的时候默认读取master数据源

Expected Result:
期望按照文档中说的类上的注解优先级低于方法上的注解

Actual Result:
实际发现只要类上加了注解,不管类上和方法上的注解指定哪个数据源,都会导致只读取默认配置的数据源

Steps to reproduce

  • Step 1
    pom依赖r如下:
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

数据源配置如下:

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: ${master.datasource.url}?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
          username: ${master.datasource.username}
          password: ${master.datasource.password}
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave:
          url: ${slave.datasource.basicUrl}?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
          username: ${slave.datasource.basicUsername}
          password: ${slave.datasource.basicPassword}
          driver-class-name: com.mysql.jdbc.Driver

类方法部分代码截图如下:
类上的注解截图:
image
方法上的注解截图:
image
在issue里面找到一个类似的回答
但是替换成不使用Iservice中的默认方法测试后还是得到了非预期的结果,参照上文提供的方法上的注解截图。

@huayanYu
Copy link
Member

无法复现, 请fork https://github.com/dynamic-datasource/dynamic-datasource-samples 中的mybatis3-sample的示例项目,给出复现代码。~

@lukelongcn
Copy link

  1. 检查 DynamicDataSourceAutoConfiguration bean 是否生效
  2. 检查 DynamicDataSourceProperties Bean 中的数据源是否加载成功

@xlpgit
Copy link

xlpgit commented May 30, 2021

service中存在环状调用,被Component标记的bean对象中调用mapper,所以导致@ds注解不生效

@huayanYu
Copy link
Member

@chengwengao 是否自行解决,如已解决请说明你遇到的问题。

@huayanYu
Copy link
Member

service中存在环状调用,被Component标记的bean对象中调用mapper,所以导致@ds注解不生效

感觉不会吧, 能不能举个栗子。

@xlpgit
Copy link

xlpgit commented May 31, 2021 via email

@huayanYu
Copy link
Member

比如,我的util标记为componet了,在uitil中又调用了mapper了,service中调用了util和mapper

------------------ 原始邮件 ------------------ 发件人: "baomidou/dynamic-datasource-spring-boot-starter" @.>; 发送时间: 2021年5月31日(星期一) 上午9:46 @.>; @.@.>; 主题: Re: [baomidou/dynamic-datasource-spring-boot-starter] 在类方法上加了@ds注解后,不管类和方法上的@ds注解指向哪个数据源,都会导致读取的始终是默认的数据源 (#375) @.***注解不生效 感觉不会吧, 能不能举个栗子。 — You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

感觉没问题 0 0,有空看能不能fork下示例项目给复现下。

@chengwengao
Copy link
Author

@chengwengao 是否自行解决,如已解决请说明你遇到的问题。

目前暂时没有在类上使用@ds注解,因为在方法上的注解可以正常使用,默认使用主数据源也是正常的,因此通过方法拆分可以满足业务,后面有空再弄份示例代码给复现看看。

@huayanYu
Copy link
Member

ok,有空能复现再联系

@showlist
Copy link

showlist commented Sep 7, 2022

谢谢你的提醒,我回头看了isevice中的默认方法,其实最后调用的还是this所申明的方法,所以不是默认方法的锅,我怀疑是否是因为spring的默认的事务传播行为导致的,再你调用这个方法方法前,你的上外层方法是否有事务,而且又调用了主数据源?

@showlist
Copy link

showlist commented Sep 7, 2022

Enviroment

JDK Version(required): JDK1.8

SpringBoot Version(required): org.springframework.boot:spring-boot-starter-webflux:2.1.9.RELEASE

dynamic-datasource-spring-boot-starter Version(required): 3.3.2

druid Version(optional): 1.1.21

Describe what happened

在类和方法上都使用了@ds注解,经过测试发现只要在类上加入了该注解,不管类上的注解是@ds("master")还是@ds("slave"),方法上的@ds是啥,都会导致方法执行的时候默认读取master数据源

Expected Result: 期望按照文档中说的类上的注解优先级低于方法上的注解

Actual Result: 实际发现只要类上加了注解,不管类上和方法上的注解指定哪个数据源,都会导致只读取默认配置的数据源

Steps to reproduce

  • Step 1
    pom依赖r如下:
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.3.2</version>
</dependency>

数据源配置如下:

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: ${master.datasource.url}?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
          username: ${master.datasource.username}
          password: ${master.datasource.password}
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave:
          url: ${slave.datasource.basicUrl}?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
          username: ${slave.datasource.basicUsername}
          password: ${slave.datasource.basicPassword}
          driver-class-name: com.mysql.jdbc.Driver

类方法部分代码截图如下: 类上的注解截图: image 方法上的注解截图: image 在issue里面找到一个类似的回答 但是替换成不使用Iservice中的默认方法测试后还是得到了非预期的结果,参照上文提供的方法上的注解截图。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants