30

1EntityManagerFactoryつ (または複数) のEntityManagerインスタンスを作成できる があります。私はサーブレット環境を使用しており、サーブレットの存続期間中 (したがって、すべてのユーザーに対して) 共有される (サーブレットコンテキストを介して) サーブレットに接続された 1 つの EntityManagerFactory があります。

次のいずれかを実行できます。

  • サーブレットの存続期間中、単一の EntityManager を作成します (たとえば、すべてのユーザー間で共有)
  • ユーザーごとに 1 つ作成します (したがって、各ユーザーは HttpSession で独自のものを取得します)。
  • HTTP リクエストごとに 1 つ作成します (たとえば、新しいものをインスタンス化し、doGetメソッドの最後で閉じることによって)

どれが最も適切ですか? EntityManager を作成するコストは重要ですか? 単一の共有 EntityManager を実行する場合、単一のトランザクション スコープがありますか (つまり、独立したユーザー間の更新は他の変更をコミットできますか)?

4

3 に答える 3

29

サーブレット全体に対して 1 つの EM ではうまくいきません。コンテナー管理の EM (EJB3 など) を使用していない場合は、特定の作業単位にEM を使用することをお勧めします。

Web アプリケーションのコンテキストでは、3 番目の提案 (HTTP 要求ごとに 1 つ) は良さそうです。ただし、これにより、サービス層を db 層と結びつけるという落とし穴に陥る可能性があります (サービス層は EM の存在を認識することすらできません)。

もう 1 つの方法は、DAO でプログラムによってトランザクションのマークを外し、DAO がすべてのメソッド呼び出しに対して新しい EM を使用するようにすることです。

編集: EM は、かなりのオーバーヘッドがある EMF とは対照的に、安価に作成できます。1 つの EMF (あなたがそうしているように見えます) と多数の EM を使用するのが道です。

于 2010-11-19T14:30:02.820 に答える
1

slsbごとに 1 つの注入されたエンティティ マネージャーを実行します。- slsb 自体はデリゲートを介してアクセスされます。デリゲートはセッションごとに 1 つあり、ローカル/リモート インターフェイスを検索します。ejb3.0 を使用しています。

于 2010-11-19T14:00:50.983 に答える
0

はい、NimChimpsky と Qwerky が DB にアクセスするときに EJB3.x を使用し、作業単位ごとに 1 つの EM を使用することに同意します。

于 2010-11-19T15:16:18.293 に答える