Как обрабатывать 2 базы данных одним способом? - PullRequest
0 голосов
/ 09 июня 2019

У меня есть служба 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.

Как я могу постепенно выполнять чтение и запись в разные дБ?

1 Ответ

0 голосов
/ 10 июня 2019

См. Ссылки ниже и пример кода, это может помочь вам решить вашу проблему.

https://www.javaworld.com/article/2077963/distributed-transactions-in-spring--with-and-without-xa.html?page=2

Управление транзакциями для нескольких баз данных Использование Spring& Hibernate

<bean id="transactionManager" class="com.springsource.open.db.ChainedTransactionManager">
  <property name="transactionManagers">
    <list>
      <bean
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
      </bean>
      <bean
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="otherDataSource" />
      </bean>
    </list>
  </property>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...