Guice、Guice Persist、Hibernate、Jersey を使用しています。@GET アノテーションが付けられたメソッドを除いて、すべてのリソース メソッドに @Transactional アノテーションが付けられています。これは、transaction-per-request スコープを構成する正しい方法ですか?
1 に答える
4
「正しい」方法はありません。それはあなたが何を達成しようとしているかによって異なります。以下で説明するように、質問への回答にはいくつかの個別の問題があります。
- データ アクセス パターン: エンタープライズ Java の従来のパターンは、永続性を処理する DAO (データ アクセス オブジェクト) をコントローラーに呼び出させることです。このパターンでは、トランザクション アノテーションはコントローラー メソッドではなく、DAO メソッドに配置されます。しかし、多くの人は DAO がやり過ぎだと感じており、エンティティ マネージャーをコントローラーに挿入することを好みます。これは完全に受け入れられる代替手段であり、私が知る限り、これがあなたが選択したアプローチです。
- スレッド セーフ: エンティティ マネージャーのインスタンスはスレッド セーフではないことに注意する必要があります。そのため、コントローラーはシングルトンであってはならず、リクエスト スコープである必要があります。つまり、エンティティ マネージャーを複数のリクエストで共有することはできないため、コントローラーを再作成するように設定し、リクエストごとに新しいエンティティ マネージャーを挿入する必要があります。
- トランザクション: データ取得操作で必要なクエリが 1 つだけの場合、トランザクションは必要ありません。ただし、完全なオブジェクト グラフを作成するには、通常、多くのクエリが必要です。この状況では、クエリ間でデータが変更される可能性があるため、一貫性を保証するために取得はトランザクション対応である必要があります。一部のフレームワークでは、実際にはすべてのデータベース アクセスをトランザクション対応にする必要があります。そうしないと、エンティティ マネージャーが正しく挿入されません。
要約すると、コントローラーがリクエスト スコープである限り、データ アクセス パターンは問題ありません。ただし、オブジェクト グラフの作成に多くのクエリが関係する場合は、「GET」関数をトランザクション対応にする必要があります。
于 2012-03-13T03:24:33.913 に答える