У меня есть служба Spring Boot RESTful CRUD в домене проката автомобилей.
Из общего обзора это простое приложение CRUD с базой данных SQL и всеми такими объектами, как Car, Client, Lease и т. Д.
Теперь я должен представить функцию генерации отчетов, предназначенную для обработки данных аренды и вычисления некоторой статистики на основе данных в базе данных SQL и сохранения отчета в MongoDB.
Я уже реализовал егосоздание ReportGenerationService
, которое зависит от OriginDataService
и MongoService
.ReportGenerationService
создает отчет на основе данных, возвращаемых OriginDataService
.В свою очередь, OriginDataService
имеет метод getData()
, который выполняет несколько вызовов на уровне DAO и, таким образом, помечается @Transactional(isolation = Isolation.REPEATABLE_READ)
.Я хочу, чтобы возвращаемые данные были согласованными.После получения данных ReportGenerationService
генерирует отчет и сохраняет его, вызывая метод MongoService
persist(Report)
.
В моей реализации я get data -> generate report -> persist report
.
Но что, если базаданные и отчет не помещаются в оперативную память?Решение состоит в том, чтобы выбрать его постепенно, сгенерировать часть отчета, сохранить часть отчета и после обработки всех строк данных объединить отчет.
Это означает, что один метод должен прочитать данные, обрабатывает это и сохраняется.Я также хочу, чтобы мой метод считывал данные с уровнем изоляции Repeatable Read, затем я должен аннотировать метод с помощью @Transactional(isolation = Isolation.REPEATABLE_READ)
.Но поскольку в методе используются 2 дБ, @Transactional
будет распространяться на них обоих, и я хочу, чтобы его использовал только SQL.
Как я могу постепенно выполнять чтение и запись в разные дБ?