Java 将事务传播到Forkjoin提交
我正在创建一个ForkJoinPool,其中包含多个线程,以执行从jpa中的一个查询执行的并行流,但是我在事务性传播到ForkJoinPool的submit方法时遇到了问题Java 将事务传播到Forkjoin提交,java,spring-boot,transactions,spring-transactions,forkjoinpool,Java,Spring Boot,Transactions,Spring Transactions,Forkjoinpool,我正在创建一个ForkJoinPool,其中包含多个线程,以执行从jpa中的一个查询执行的并行流,但是我在事务性传播到ForkJoinPool的submit方法时遇到了问题 @Transactional(readOnly = true) public void streamTest() { ForkJoinPool customThreadPool = new ForkJoinPool(20); try { customThreadPool.submit(() ->
@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提交的方法的执行中,有没有办法?我发现了如何在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();
}
}我发现了如何在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();
}
}