9

我正在使用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);
}

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

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

4

3 回答 3

6

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

于 2013-04-12T11:42:03.147 回答
1

通常 Spring 有线对象是线程安全的。

以下是一些有用的链接:

http://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-part-two-crud/

确保您使用正确的事务管理器

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/transaction/jta/JtaTransactionManager.html

于 2013-04-12T12:54:00.653 回答
0

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

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

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

于 2016-05-17T18:26:33.927 回答