2017-02-07 44 views
1

スレッドセーフなコントローラを作成するにはどうすればよいですか?スプリングブートでスレッドセーフコントローラを使用する方法

ベストプラクティスとして、コントローラはシングルトンです。

私のコードをステートフルにするautowiredサービスオブジェクトを介してユーザーデータを格納する以下のコードを考えてみましょう。 以下のコードをスレッドセーフにするにはどうしたらいいですか?

@RestController 
class ApiController { 

    @Autowired 
    IDbService<User> iDBService; 

    @RequestMapping(value = "/api/adduser", method = RequestMethod.POST) 
    public ResponseEntity<User> createUser(@RequestBody User user){ 

     User savedUser=iDBService.create(user); 

     return new ResponseEntity<User>(savedUser, HttpStatus.CREATED); 
    } 

私のサービスの実装です。 従って私は、彼らがスレッドセーフな方法で実装する必要があり、私のサービス

public class IDbServiceImpl<T> implements IDBService<T>{ 

@Autowired 
GenericRepository<T, Serializable> genericRepository; 

@Override 
public T create(T object) { 
    return genericRepository.save(object); 
} 

}

+2

コードはスレッドセーフです....サービス内に共有状態が存在しないと仮定すると... –

+0

IDbServiceがstatefullでない限り、このコントロールステートフルは考慮しません。 – GPI

+0

私のサービスがステートフルな場合、それは問題になるでしょう –

答えて

0

コントローラはsingletonsある中で変数を共有しています。

コントローラがステートレスであるようにアプリケーションを設計します。 @Repository層にトランザクションサポートを追加します。

例:

public class GenericRepository<T, Serializable> { 
@Transactional 
public void save(T object) { 
    // save user 
} 
} 

あなたは春の宣言的トランザクション管理メカニズムを使用することができます。 @Transactionalアノテーション自体は、単一のデータベーストランザクションのスコープを定義します。

+0

コントローラはアプリケーションスコープでなければなりません。 –

+0

@jonesjalapat答えを編集します – fabfas

0

コントローラはスレッドセーフです。状態を格納するインスタンス変数がないため。ユーザーオブジェクトはリクエストごとに異なり、MVCフレームワークによって解決されます。

+0

iDBServiceは共有されています –

+1

iDBServiceは共有されていますが、共有状態はなく、他のスレッドによって変更可能な値を格納するインスタンス変数もあります。[http://stackoverflow.com/questions/11508405/are-spring-mvc-controllers-singletons]&[http://stackoverflow.com/questions/11485486/regarding-thread-safety-of-servlet] –

2

コントローラはデフォルトでシングルトンで、サービスはデフォルトでシングルトンです。

したがってスレッドセーフなものにするためには、サービス内部のオブジェクトの状態を変更する場合に、サービス内で行われる操作がスレッドセーフであることを確認する必要があります。リスト。

rdbmsを使用する場合は、トランザクションに関連する問題があります。

springとJpaを使用すると、@Transactionalを使用している場合、トランザクションマネージャーは更新を気にします。プレーンなjdbcメソッドの場合は、純粋なjdbcを使用して、トランザクション処理を自分で行うか、transaction managerに付属のspring-jdbcを使用します。

書き込みの進行中にデータベースの行を変更しないようにするには、行ロック関連のメカニズムを考慮する必要があります。 - gkatzioura Feb 7 at 15:23

@Transactionalを使用しているJPAの場合は、作業を行います。ただし、アプリケーションによっては、ロックを考慮する必要があります。 this jpaによるロックに関する記事をチェックしてください。

+0

はい。これらの点を理解しています。削除を追加する予定です、アップデート、私のservice.soのメソッドを取得する方法は、トランザクション関連の問題を解決します。 –

+0

springとJpaを使用すると、トランザクションマネージャは@Transactionalを使用している場合、アップデートを処理します。 プレーンなjdbcメソッドの場合は、pure jdbcを使用してトランザクション処理を自分で行うか、トランザクションマネージャーに付属のspring-jdbcを使用します。 これらのリンクを確認してください http://www.journaldev.com/2603/spring-transaction-management-jdbc-example http://docs.spring.io/spring-framework/docs/4.2.x/spring -framework-reference/html/transaction.html – gkatzioura

+0

書き込みが進行中の場合にデータベース行を変更しないようにするには、行ロック関連のメカニズムを考慮する必要があります。 – gkatzioura

関連する問題