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
方法声明)。
通常,Spring有线对象是线程安全的。
以下是一些有用的链接:
http://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-two-crud/
确保使用正确的事务管理器
我不是肯定的,我可能完全错了,但我不认为存储库在特定情况下是线程安全的。 看一眼:
github上的spring-data-commons中的RepositoryFactorySupport.QueryExecutorMethodInterceptor。
有一个包含方法 – >查询的并发hashmap。 如果这些查询包含state,或者这些查询的任何属性包含state,则存储库不再是线程安全的。 一个很好的例子是spring-data-neo4j。 DerivedGraphRepositoryQuery特别存在问题,因为它包含CypherFinderQuery。 THOSE包含查询参数forms的状态。 我相信它可能有一个竞争条件,其中一个参数在DerivedGraphRepository中的查询期间被另一个线程覆盖。 如果查询对象的作者为其提供状态,则可能在其他spring数据存储库中发生这种情况。