7

CDI と EJB、および Entity Boundary Control (ECB) パターンについて理解しようとしています。ECB パターンについての私の理解は、境界がトランザクション境界の開始と終了であるということです。さらに、CDI は EJB のようなトランザクション サポートを提供しません。

したがって、ECB パターンを正常に実装したい場合は、次のことが当てはまります。

  1. EJB (つまり、@stateless、@stateful、@singleton) を使用して境界部分を実装し、CDI または EJB を使用してコントロール層を実装できます。
  2. CDI を使用して境界と制御の部分を実装できますが、(http://smokeandice.blogspot.com/2009/12/cdi-and-declarative-transactions.html) のように、境界にトランザクション サポートを実装できます。
  3. CDI で Boundary を実装できず、コントロール層で EJB を使い始めることができません。

ありがとう

4

1 に答える 1

13

境界専用の EJB とコントローラー用の CDI を使用して、JavaEE 6 に ECB パターンを正常に実装しました。私のアーキテクチャの典型的なスタックは

  • REST サービスを境界として実装するために JAX-RS アノテーションでアノテーションが付けられたステートレス EJB
  • コントローラーとしての @Dependent スコープのビジネス ロジック用の CDI マネージド Bean
  • JPA の EntityManager を使用してデータベースと対話するデータ アクセス オブジェクトの @Dependent スコープ内の CDI マネージド Bean
  • JPA エンティティ Bean

境界を形成するステートレス EJB には、デフォルトである @TransactionAttribute(REQUIRED) で常に注釈が付けられます。他のトランザクション属性は使用しません。そうすることで、Boundary とのすべての対話が 1 つのトランザクションで確実に行われるようにすることができます。

CDI マネージド Bean に @Dependent スコープのみを使用することで、すべてのスレッドがその Bean の独自のインスタンスを持つようにすることができます。したがって、複数のスレッドが同時に CDI マネージド Bean にアクセスすることはありません。そうすることで、一般的な並行性の問題を回避できます。

より重い、プールされた EJB を境界用に使用し、軽量の CDI マネージド Bean をアプリケーションの残りの部分に使用すると、私にとっては非常にうまく機能します。

于 2012-01-06T18:39:19.657 に答える