Spring Data(JPA)存储库是否是线程安全的? (又名SimpleJpaRepository线程安全)

时间:2013-04-12 07:43:13

标签: java jpa spring-data spring-data-jpa

我使用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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

答案 2 :(得分:0)

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

在github上的spring-data-commons中的RepositoryFactorySupport.QueryExecutorMethodInterceptor。

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