【问题标题】:How to handle 2 databases in one method?如何以一种方法处理 2 个数据库?
【发布时间】:2019-06-09 10:08:22
【问题描述】:

我在汽车租赁领域有一个 Spring Boot RESTful CRUD 服务。

从总体上看,它是一个简单的 CRUD 应用程序,带有 SQL 数据库以及 Car、Client、Lease 等所有实体。

现在我必须介绍一个报告生成功能,该功能旨在处理租赁数据并根据 SQL db 中的数据计算一些统计数据并将报告持久化到 MongoDB。

我已经通过创建一个依赖于OriginDataService 和MongoService 的ReportGenerationService 来实现它。 ReportGenerationService 根据OriginDataService 返回的数据生成报告。反过来,OriginDataService 有一个方法getData(),它对 DAO 层进行多次调用,因此使用@Transactional(isolation = Isolation.REPEATABLE_READ) 进行注释。我希望返回的数据是一致的。 ReportGenerationService获取数据后,通过调用MongoService的persist(Report)方法生成报表并持久化。

在我的实现中我get data -> generate report -> persist report。

但是如果基础数据和报告无法放入 RAM 怎么办? 解决方法是一点一点的选择,生成部分报表,持久化部分报表,处理完所有行数据后合并报表。

这意味着一个方法应该读取数据,处理它并持久化。 我还希望我的方法以可重复读取隔离级别读取数据,然后我必须用@Transactional(isolation = Isolation.REPEATABLE_READ) 注释该方法。但由于该方法中使用了 2 个 db,@Transactional 将传播到它们两者上,我只希望 SQL 使用它。

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

【问题讨论】:

    标签: java transactions spring-transactions


    【解决方案1】:

    请参考以下链接和代码示例,它可能会帮助您解决问题。

    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>
    

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2023-03-16
      • 2012-12-29
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      相关资源
      最近更新 更多