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

Gre*_*pff 7 java jpa spring-data spring-data-jpa

我正在使用Spring Data(JPA)存储库来处理CRUD样板.

我这样定义我的存储库接口:

import org.springframework.data.repository.CrudRepository;

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

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

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

Oli*_*ohm 5

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

  • 我认为这是指定“EntityManager”在 JPA 中的行为方式的一个简单结果。默认情况下它不是线程安全的,因此需要对其进行管理(读取:正确绑定到线程并代理以指向线程绑定实例)。在 Spring 中,这是通过使用“SharedEntityManagerCreator”来实现的。在 CDI 情况下,容器将为您执行此操作。 (4认同)