如何用一种方法处理2个数据库?

时间:2019-06-09 10:08:22

标签: java transactions spring-transactions

我在租车域中有一个Spring Boot RESTful CRUD服务。

从总体上看,它是一个简单的CRUD应用程序,具有SQL数据库和所有诸如Car,Client,Lease等实体。

现在,我必须引入一个报告生成功能,该功能旨在处理租赁数据并基于SQL db中的数据计算一些统计信息,并将报告保存到MongoDB中。

我已经通过创建依赖于ReportGenerationServiceOriginDataService的{​​{1}}实现了它。 MongoService根据ReportGenerationService返回的数据生成报告。依次,OriginDataService具有方法OriginDataService,该方法对DAO层进行了多次调用,并因此用getData()进行了注释。我希望返回的数据是一致的。在获取数据后,@Transactional(isolation = Isolation.REPEATABLE_READ)会生成报告并通过调用ReportGenerationService的{​​{1}}方法来保留报告。

在我的实现中,我MongoService

但是,如果基本数据和报告无法放入RAM中怎么办? 解决方案是一点一点地选择它,生成报告的一部分,保留报告的一部分,然后在处理完所有数据行后合并报告。

这意味着一种方法应读取数据,对其进行处理并保留。 我还希望我的方法以“可重复读取”隔离级别读取数据,然后必须用persist(Report)对该方法进行注释。但是由于该方法中使用了2个db,所以get data -> generate report -> persist report会在两个数据库上同时传播,我只希望SQL使用它。

如何逐步读取和写入不同的数据库?

1 个答案:

答案 0 :(得分:0)

请参阅下面的链接和代码示例,它可以帮助您解决问题。

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

Transaction management for multiple database Using 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>