9

CRUD ボイラープレートを処理するためにSpring Data (JPA) リポジトリを使用しています。

リポジトリ インターフェイスを次のように定義します。

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 に答える
0

私はまだ確信が持てず、完全に間違っている可能性がありますが、特定のケースではリポジトリがスレッドセーフであるとは思いません。を見てみましょう:

github の spring-data-commons の RepositoryFactorySupport.QueryExecutorMethodInterceptor 。

メソッド -> クエリを含む同時ハッシュマップがあります。これらのクエリに状態が含まれている場合、またはそれらのクエリのプロパティに状態が含まれている場合、リポジトリはスレッドセーフではなくなります。良い例は spring-data-neo4j です。DerivedGraphRepositoryQuery には、CypherFinderQuery が含まれているため、特に問題があります。これらには、クエリへのパラメーターの形式で状態が含まれます。DerivedGraphRepository でのクエリ中に別のスレッドによってパラメーターが上書きされるという競合状態が発生する可能性があると思います。これは、クエリ オブジェクトの作成者が状態を指定した場合、他の Spring データ リポジトリで発生する可能性があります。

于 2016-05-17T18:26:33.927 に答える