22

現在、JavaEE6-アプリケーションですべてのデータベース操作を処理するEJB3データアクセスクラスを作成しています。さて、Java EE 6は新しいApplicationScopedアノテーションを提供するので、EJBはどのような状態にする必要があるのか​​、それともステートレスにする必要があるのか​​疑問に思います。

@StatelessDAOをSessionBeanにするか、@ApplicationScopedBeanにする方がよいでしょうか。どう@Singletonですか?DAOに関連するこれらのオプションの違いは何ですか?

編集: 完全なJavaEE6プラットフォームでGlassfish3.0.1を使用しています

4

3 に答える 3

17

DAOを@StatelessSessionBeanまたは@ApplicationScopedBeanにする方がよいでしょうか?@Singletonはどうですか?DAOに関連するこれらのオプションの違いは何ですか?

DAOにはステートレスセッションBeanを使用しません。

  1. EJBはコンテナによってプールされるため、プールごとにN個のインスタンスがあり、数千のテーブルがある場合は、リソースを浪費するだけです(デプロイ時のコストは言うまでもありません)。

  2. DAOをSLSBとして実装すると、EJBチェーンが促進されますが、これはスケーラビリティの観点からは適切な方法ではありません。

  3. DAOレイヤーをEJBAPIに結び付けません。

EJB 3.1で導入された@Singletonものは、状況を少し改善する可能性がありますが、それでもDAOをEJBとして実装しません。私はむしろCDIを使用したいと思います(そしておそらくカスタムステレオタイプ、たとえばこの記事を参照してください)。

または、DAOをまったく使用しません。JPAのエンティティマネージャーはドメインストアパターンの実装であり、DAOでドメインストアへのアクセスをラップしてもあまり価値はありません。

于 2010-07-11T20:58:30.813 に答える
2

少し考え直したところ、DAOは実際には私がやりたかったことの正しい名前ではないようです。パスカルが言ったように、多分それは本当にファサードです。Netbeans Petstoreの例(JavaEE6サンプルアプリケーション、ここを参照)を見つけました。ここには、データベースからエンティティを検索/作成/削除するためのItemFacadeがあります。ステートレスセッションBeanです。このように見えます:

@Stateless
public class ItemFacade implements Serializable {
    @PersistenceContext(unitName = "catalogPU")
    private EntityManager em;

    public void create(Item item) { ... }
    public void edit(Item item) { ... }
    public void remove(Item item) { ... }
    public Item find(Object id) { ... }
    public List<Item> findAll() { ... }
    public List<Item> findRange(int maxResults, int firstResult) { ... }
    public int getItemCount() { ... }
}

結論として、DAO DAOとは呼ばなくなりましたが、代わりに、たとえばPersonEJB( "PersonFacade"は誤解される可能性があると思います)を@Statelessにします。これは、Netbeansの例も適切に設計されていると考えられるためです。

于 2010-07-14T14:29:54.180 に答える
0

@Pascal:私の意見では、コンテナがこれらのサービスを管理しているため、私のDAOはトランザクションまたはセキュリティの「責任」を負いません。DAOのメソッドに注釈を付けているだけです(トランザクションは自動的に処理されるため、セキュリティのためのみ)。注釈はすでに「責任」ですか?

さて、あなたは私に私のデザインについて再考させます。それが大丈夫で、あまり話題から外れていないことを願っていますが、おそらくそれは役立つでしょう-これは私が今日JEE6を使用している方法です:

  • JSFはCDIBeanにアクセスします。
  • CDI Beanは、「ビジネスロジック」を実行するDAO-EJBにアクセスします
  • そのため、現在、私の唯一の「ビジネスロジック」はCRUDを実行しています。後で、非同期メソッドやタイマーサービスなどの重要なタスク用に他のEJBを追加します。
  • 私のDAOは汎用であり、JPA2 Criteria Queryを使用してタイプセーフなクエリを実行します(文字列はまったくありません)
  • 永続化/更新/削除(単純すぎる)にはDAOは必要ないことはわかっていますが、クエリにはDAOが必要です。だから私はそれらをまとめるだけです

そのアプローチに何か問題がありますか?

于 2010-07-11T23:33:28.677 に答える