Closed jave-joe closed 4 years ago
这不是BUG, 跟框架也没什么关系.
这是由于 spring-jdbc 的部分引起的. 如果有事物: 那么整个事务内所有和数据库的操作都会用第一次获取到的连接, 不会重复的找数据源要连接. 如果没有事物: 框架的链式注解都会生效 .
事物获取连接的部分可以查看: org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection
这不是BUG, 跟框架也没什么关系.
这是由于 spring-jdbc 的部分引起的. 如果有事物: 那么整个事务内所有和数据库的操作都会用第一次获取到的连接, 不会重复的找数据源要连接. 如果没有事物: 框架的链式注解都会生效 .
事物获取连接的部分可以查看: org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection
好的,非常感谢!
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;
@Service public class IsfasCmdgrpServiceImpl extends ServiceImpl<IsfasCmdgrpMapper, IsfasCmdgrp> implements IIsfasCmdgrpService {
@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); }
}