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

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

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

import org.springframework.data.repository.CrudRepository; public interface FooRepository extends CrudRepository { public Foo findByXAndYAndZ(X x, Y y, Z z); } 

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

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

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

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

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

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