2017-12-20 3 views
3

私は今まで、単一のスレッドアプリケーションで以下のようなリポジトリオブジェクトを使用してきました。複数のスレッドにわたってリポジトリクラスオブジェクトを使用する

@Service 
class MyEntityService { 
    @Autowired 
    private MyEntityRepository repository; 
} 

リポジトリには、以下のように見える - 私はエグゼキュータのサービスを介して複数のスレッドを使用して開始し、同時にデータベースへの書き込みを計画し

import com.myorg.mypackage.entities.facebook.MyEntity; 
import org.springframework.data.repository.CrudRepository; 
public interface MyEntityRepository extends CrudRepository<MyEntity, String> { 
    MyEntity findByFacebookPageId(String facebookPageId); 
} 

。リポジトリの複数のインスタンスを作成する必要がありますか、それとも1つのリポジトリが行うのですか?

+0

これらの各メソッドは、暗黙のうちに 'Transactional'でアノテートされており、これはあなたが気にすべきものです。 (あなたが表示しているすべてのコード) - あなたが安全な側にいる、特に*ここではあなたがやっていることはすべてここに読まれているからです。 – Eugene

+0

彼らはスレッドセーフですが、どうにかしてコンテキストを処理する必要があります。理想的には、接続/セッションを各スレッドにバインドして、毎回プールから1つをチェックアウトしないようにします。また、トランザクションで何をしたいのかという質問もあります。すべてのメソッドコールを開いたり閉じたりするのはむしろ遅くなります。何をしているかによっては、マルチスレッドコードをシリアルにする可能性があります。 –

答えて

1

一般的に言えば、spring jpaはスレッドセーフです。それはすべて、春にエンティティマネージャの工場から取得されたエンティティマネージャから来ます。 Springは各スレッドに新しいエンティティ・マネージャを挿入して、エンティティ・マネージャをスレッド・セーフに見えるようにします。別のトランザクションがあなたのリクエストごとに張られている - - リポジトリから

チェックこの素敵なarticle

関連する問題