我正在创建一个带有多个线程的ForkJoinPool来执行并行流,该线程是从jpa中的查询执行的,但是我无法将Transactional传播传播到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();
}
}
我收到错误消息:“您正在尝试在没有周围事务的情况下执行流查询方法,该事务使连接保持打开状态,以便实际上可以使用Stream。请确保使用该流的代码使用@Transactional或任何其他声明(只读)事务的方式。”
如果我脱下ForkJoinPool来执行流,则可以正常工作。 如何将事务(readOnly)传播到从ForkJoinPool提交的方法的执行中,有办法吗?
答案 0 :(得分:0)
我发现了如何在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();
}
}