将事务传播到 Forkjoin 提交

我正在创建一个具有多个线程的 ForkJoinPool 来并行执行一个流,它是从 jpa 中的查询执行的,但是我在将事务传播到 ForkJoinPool 的方法提交时遇到了问题。


@Transactional(readOnly = true)

public void streamTest() {

    ForkJoinPool customThreadPool = new ForkJoinPool(20);

    try {

    customThreadPool.submit(() ->

         priceRepository.streamAll()

         .parallel()

         .map(p -> this.transform(p))

         .forEach(System.out::println)

         ).get();

    } catch (InterruptedException | ExecutionException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }

}

我收到错误消息:“您正在尝试在没有保持连接打开的周围事务的情况下执行流式查询方法,以便实际上可以使用流。确保使用流的代码使用@Transactional 或任何其他方式声明一个(只读)事务。”


如果我取消 ForkJoinPool 来执行流,它工作正常。如何将事务(只读)传播到从 ForkJoinPool 提交的方法的执行,有没有办法?


四季花海
浏览 101回答 1
1回答

跃然一笑

我发现了如何在 ForkJoinPool 的任务中设置事务。我只需像下面那样使用 TransactionSynchronizationManager。@Transactional(readOnly = true)public void streamTest() {ForkJoinPool customThreadPool = new ForkJoinPool(20);try {customThreadPool.submit(() -> {    TransactionSynchronizationManager.setActualTransactionActive(true);    TransactionSynchronizationManager.setCurrentTransactionReadOnly(true);    TransactionSynchronizationManager.initSynchronization();     priceRepository.streamAll()     .parallel()     .map(p -> this.transform(p))     .forEach(System.out::println);     }).get();} catch (InterruptedException | ExecutionException e) {    // TODO Auto-generated catch block    e.printStackTrace();}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java