有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是Spring数据(JPA)存储库线程安全吗?(aka是SimpleParepository线程安全的)

我正在使用Spring Data (JPA) repository来处理CRUD样板文件

我这样定义我的存储库界面:

import org.springframework.data.repository.CrudRepository;

public interface FooRepository extends CrudRepository<Foo, Long>
{
  public Foo findByXAndYAndZ(X x, Y y, Z z);
}

然后,Spring自动神奇地为我生成了上述接口的一个实现。我们得到的是一个代理,但我相信最终我们会得到一个org.springframework.data.jpa.repository.support.SimpleJpaRepository

如果底层目标类是线程安全的,则JdkDynamicAopProxy是线程安全的。因此,问题是:SimpleJpaRepository线程安全吗


共 (3) 个答案

  1. # 1 楼答案

    一般来说,是的。它假设一个托管的EntityManager,我们将从Spring的工厂类(如果您使用Spring作为容器)或作为CDI托管bean(通过@Producer方法声明)获取它

  2. # 3 楼答案

    我还不确定,我可能完全错了,但我不认为存储库在特定情况下是线程安全的。看看:

    存储工厂支持。github上spring数据共享区中的QueryExecutorMethodInterceptor

    有一个包含方法的并发hashmap->;查询。如果这些查询包含state,或者这些查询的任何属性包含state,则存储库不再是线程安全的。spring-data-neo4j就是一个很好的例子。DerivedGraphRespositoryQuery特别存在问题,因为它包含CypherFinderQuery。这些问题以查询参数的形式包含状态。我相信在DerivedGraphRespository中的查询过程中,可能存在一个争用条件,其中一个参数被另一个线程覆盖。如果查询对象的作者向其他spring数据存储库提供状态,则可能会发生这种情况