@Transactional резко замедляет Rest API - PullRequest
0 голосов
/ 28 апреля 2018

Сервис получает данные из БД в конструкторе и сохраняет их в HashMap, а затем возвращает данные из HashMap. Пожалуйста, посмотрите:

@RestController
@RequestMapping("/scheduler/api")
@Transactional(readOnly = true, transactionManager = "cnmdbTm")
public class RestApiController {

    private final Set<String> cache;

    @Autowired
    public RestApiController(CNMDBFqdnRepository cnmdbRepository, CNMTSFqdnRepository cnmtsRepository) {
        cache = new HashSet<>();
        cache.addAll(getAllFqdn(cnmdbRepository.findAllFqdn()));
        cache.addAll(getAllFqdn(cnmtsRepository.findAllFqdn()));
    }

    @RequestMapping(value = "/fqdn", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public List<SchedulerRestDto> checkFqdn(@RequestBody List<SchedulerRestDto> queryList) throws ExecutionException {
        for (SchedulerRestDto item : queryList) {
            item.setFound(1);
            if (!cache.contains(item.getFqdn())) {
                item.setFound(0);
            }
        }
        return queryList;
    }

    private Set<String> getAllFqdn(List<String> fqdnList) {
        Set<String> result = new HashSet<>();
        for (String fqdn : fqdnList) {
            result.add(fqdn);
        }
        return result;
    }

}

Но я всегда получаю результат примерно за 2 секунды. Я думал, что это немного медленно для 35К строки, которую я получил от БД.

Я пытался выяснить, где проблема. Я сохраняю сериализованный файл HashMap в файле, а модифицированный конструктор:

@Autowired
public RestApiController(CNMDBFqdnRepository cnmdbRepository, CNMTSFqdnRepository cnmtsRepository) {
    try (final InputStream fis = getResourceAsStream("cache-hashset.ser");
         final ObjectInputStream ois = new ObjectInputStream(fis)) {
        cache = (Set<String>) ois.readObject();
    }
}

после того, как сервис вернул результат менее чем за 100 мс.

Я думаю, что это связано с БД, но я точно не знаю, как это исправить.

Есть идеи?

1 Ответ

0 голосов
/ 30 апреля 2018

После нескольких часов экспериментов я понял, что основной причиной является аннотация @Transactional для класса.

Когда я переместил эту аннотацию на метод, служба вернула ответ быстрее. В своем окончательном решении я переместил эту аннотацию в другой класс. Новый конструктор

@Autowired
public RestApiController(FqdnService fqdnService, SqsService sqsService) {
    Objects.requireNonNull(fqdnService);
    cache = fqdnService.getCache();
}

Код чище, проблем с производительностью нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...