我使用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
线程安全吗?
答案 0 :(得分:5)
一般来说,是的。它假设一个托管EntityManager
,我们将从Spring的工厂类中获取(如果您使用Spring作为容器)或CDI托管bean(通过@Producer
方法声明)。
答案 1 :(得分:0)
通常,Spring有线对象是线程安全的。
以下是一些有用的链接:
http://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-two-crud/
确保使用正确的事务管理器
答案 2 :(得分:0)
我还没有肯定,我可能完全错了,但我不认为存储库在特定情况下是线程安全的。看看:
在github上的spring-data-commons中的RepositoryFactorySupport.QueryExecutorMethodInterceptor。
有一个包含方法的并发hashmap - &gt;查询。如果这些查询包含state,或者这些查询的任何属性包含state,则存储库不再是线程安全的。一个很好的例子是spring-data-neo4j。 DerivedGraphRepositoryQuery特别存在问题,因为它包含CypherFinderQuery。这些包含查询参数形式的状态。我相信它可能有一个竞争条件,其中一个参数在DerivedGraphRepository中的查询期间被另一个线程覆盖。如果查询对象的作者为其提供状态,则可能会在其他Spring数据存储库中发生这种情况。