baomidou / dynamic-datasource

dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务
https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
Apache License 2.0
4.74k stars 1.19k forks source link

在service中调用另一个service里的方法 DS注解的库没有生效 #220

Closed jave-joe closed 4 years ago

jave-joe commented 4 years ago

Enviroment

JDK Version(required): 1.8

SpringBoot Version(required): 2.1.3.RELEASE

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

druid Version(optional):1.1.17

Describe

我再程序中配了两个数据源,一个主master数据源,另外一个是另一个实例库数据源名称为:dynamicDS

代码结构为controller-->service-->mapper 我在service的实现类上添加了注解@DS("dynamicDS") 当我通过controller里直接通过注入的service去调用里面的方法的时候,使用的是dynamicDS数据源没有问题 但是当我通过controller调用某个service(默认数据源),再从这个service里去调用@DS("dynamicDS")的serivce里的方法的时候,没有使用dynamicDS数据源,而使用了默认数据源。

Expected Result:

期望使用@DS("dynamicDS")注解的类和方法不论通过什么方式调用都走的dynamicDS数据源

Actual Result:

Steps to reproduce

@Autowired private IIsfasCmdgrpService isfasCmdgrpService;

@PutMapping(value = "/edit")
@Transactional
public Result<?> edit(@RequestBody IsfasCmdgrp isfasCmdgrp) {
    List<IsfasCmdgrp2tmpl> isfasCmdgrp2TmplList = isfasCmdgrp.getIsfasCmdgrp2TmplList();
    isfasCmdgrpService.updat(isfasCmdgrp);
    return Result.ok("编辑成功!");
}

@Service public class IsfasCmdgrpServiceImpl extends ServiceImpl<IsfasCmdgrpMapper, IsfasCmdgrp> implements IIsfasCmdgrpService {

@Autowired
private ISysDataLogService dataLogService;//这个service里指向另一个数据源

@Override public void updat(IsfasCmdgrp isfasCmdgrp) { this.updateById(isfasCmdgrp); dataLogService.addDataLog(CommonConstant.OPER_TYPE_MOD,"指令组表", isfasCmdgrp.getCmdgrpId(), JSONObject.toJSONString(isfasCmdgrp),"修改指令组"); } }

@DS("dynamicDS") @Service public class SysDataLogServiceImpl extends ServiceImpl<SysDataLogMapper, SysDataLog> implements ISysDataLogService { @Autowired private SysDataLogMapper logMapper;

@Override public void addDataLog(int operType,String tableName, String dataId, String dataContent,String description) { String versionNumber = "0"; String dataVersion = logMapper.queryMaxDataVer(tableName, dataId); if(dataVersion != null ) { versionNumber = String.valueOf(Integer.parseInt(dataVersion)+1); } SysDataLog log = new SysDataLog(); log.setOperType(operType); log.setDataTable(tableName); log.setDataId(dataId); log.setDataContent(dataContent); log.setDataVersion(versionNumber); log.setDescription(description); this.save(log); }

}

ls9527 commented 4 years ago

这不是BUG, 跟框架也没什么关系.

这是由于 spring-jdbc 的部分引起的. 如果有事物: 那么整个事务内所有和数据库的操作都会用第一次获取到的连接, 不会重复的找数据源要连接. 如果没有事物: 框架的链式注解都会生效 .

事物获取连接的部分可以查看: org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection

jave-joe commented 4 years ago

这不是BUG, 跟框架也没什么关系.

这是由于 spring-jdbc 的部分引起的. 如果有事物: 那么整个事务内所有和数据库的操作都会用第一次获取到的连接, 不会重复的找数据源要连接. 如果没有事物: 框架的链式注解都会生效 .

事物获取连接的部分可以查看: org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection

好的,非常感谢!