首页 > 解决方案 > 来自 Spring JPA 的 Iterable 结果的 Spliterators 是否可以安全地在 parallelStream 中使用

问题描述

类似于OneToMany 集合上的并行流是否安全?但我的问题特定于 Spring JPA Repository 查询的结果,例如

public interface Students extends JpaRepository<Student, UUID> {
    @EntityGraph("Student.withProgramAndSchedule")
    @Query("from Student s")
    Iterable<Student> findAllWithProgramAndSchedule();
}

我可以安全地并行使用它吗?例如

StreamSupport.stream(students.findAllWithProgramAndSchedule().spliterator(), true)

标签: javaspringjpajava-streamthread-safety

解决方案


JPA 实体管理器及其管理的实体不是线程安全的。

考虑它的一种方法是students.findAllWithProgramAndSchedule()可能会触发延迟加载。在后台,这将使用本身不是线程安全的 JDBC 连接,因此students.findAllWithProgramAndSchedule()不能是线程安全的。


推荐阅读