Не удается переключить AbstractRoutingDataSource без использования @Transactional - PullRequest
1 голос
/ 16 марта 2020

У меня есть проект Spring-Boot. Как упоминалось выше, я хочу использовать AbstractRoutingDataSource для переключения DataSouce . Я не хочу использовать @Transactional, так как транзакции не нужны.
Но когда я передаю свой метод, кажется, что @Transactional используется, но когда я тестирую свой метод в модульном тесте, он запускается хорошо, я думаю, что это странно, потому что в модульном тесте @Transactional не должен работать.

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {
    return DynamicContextHolder.peek();
}

}

Метод контроллера

@RequestMapping(value = "/pipeline/analyze/{systemId}/{dbName}/{dbSchemaName}/{dbTableName}", method = RequestMethod.GET)
public String pipelineAnalyze(@PathVariable("systemId") Long systemId, @PathVariable("dbName") String dbName, @PathVariable("dbSchemaName") String dbSchemaName, @PathVariable("dbTableName") String dbTableName) throws IOException {

    ETLServerAccessEntityInterface etlServerAccessEntity = etlServer.getETLServerAccessEntity();

   /* LOGGER.info("===etlServerAccessEntity.getAccessToken()===");
    LOGGER.info(etlServerAccessEntity.getAccessToken());
    LOGGER.info("isAlive=" + etlServer.isAlive());*/


    TableInfoMasterEntity tableInfoMaster = new TableInfoMasterEntity();
    TableInfoMasterEntityPk tableInfoMasterPk = new TableInfoMasterEntityPk();
    tableInfoMasterPk.setSystemId(systemId);
    tableInfoMasterPk.setDbName(dbName);
    tableInfoMasterPk.setDbSchemaName(dbSchemaName);
    tableInfoMasterPk.setDbTableName(dbTableName);
    tableInfoMaster.setId(tableInfoMasterPk);
    Example<TableInfoMasterEntity> exampleTableInfoMaster = Example.of(tableInfoMaster);


    List<TableInfoMasterEntity> filteredTableInfoMaster = tableInfoMasterService.findAll(exampleTableInfoMaster);
    System.out.println("filteredTableInfoMaster.size()=" + filteredTableInfoMaster.size());
    TableInfoMasterEntity tableInfoMasterEntity = filteredTableInfoMaster.get(0);
    pipelineRequirementAnalyzeService.analyze(tableInfoMasterEntity);


    return String.valueOf(pipelineRequirementAnalyzeService.toString());
}

устройство test

@Test
public void findByTemplateNameContaining() throws IOException {
    ETLServerAccessEntityInterface etlServerAccessEntity = etlServer.getETLServerAccessEntity();
    TableInfoMasterEntity tableInfoMaster = new TableInfoMasterEntity();
    TableInfoMasterEntityPk tableInfoMasterPk = new TableInfoMasterEntityPk();
    tableInfoMasterPk.setSystemId(1);
    tableInfoMasterPk.setDbName("DGRAMES");
    tableInfoMasterPk.setDbSchemaName("MESSERIES");
    tableInfoMasterPk.setDbTableName("TBLEMSACCESSORYSTATE_MAINTAIN");
    tableInfoMaster.setId(tableInfoMasterPk);
    Example<TableInfoMasterEntity> exampleTableInfoMaster = Example.of(tableInfoMaster);
    List<TableInfoMasterEntity> filteredTableInfoMaster = tableInfoMasterService.findAll(exampleTableInfoMaster);
    TableInfoMasterEntity tableInfoMasterEntity = filteredTableInfoMaster.get(0);
    pipelineRequirementAnalyzeService.analyze(tableInfoMasterEntity);
    System.out.println();
}

Эти два метода похожи, все они передают pipelineRequirementAnalyzeService.analyze(tableInfoMasterEntity);, но результаты разные. здесь результат ошибки и результат успеха .

...