14

EntityManager定義上、スレッドセーフではありません。サーブレットの仕様によると、非分散環境で を実装していない場合、定義ごとにサーブレット インスタンスは 1 つしかSingleThreadModelありません。

したがって、Java EE でサーブレットのフィールドにEntityManagerスルーを挿入すると、スレッドセーフではありません。@PersistenceContext

public class MyServlet extends HttpServlet {

    // Not thread-safe, should be using EMF instead.
    @PersistenceContext
    private EntityManager em;
}
  1. Spring Bean のデフォルトのスコープはシングルトンですが、SpringがトランザクションをバインドするためにEntityManager使用するため、これはスレッドセーフであると言うのは正しいですか?ThreadLocalEntityManager

  2. 上記のサーブレットの例は Spring でも有効ですか? まだスレッドセーフではありませんか?

  3. このThreadLocalアプローチは Spring 管理 Bean に対してのみ機能し、プレーンなサーブレットはその 1 つではありませんか?

  4. 私が覚えている限りでは、 を注入するのはコンテナの責任EntityManagerです。Glassfish Java EE 実装では、@PersistenceContextas インジェクション ポイントを発見するのはアプリケーション サーバーでした。
    春にはどのように見えますか?Spring Framework はそれらのアノテーションを発見する責任がありますか、それとも JPA 実装者の責任ですか?

4

1 に答える 1

7

質問2、3、および4-Springは、SpringBean以外のクラスには注意を払いません。MyServletそのため、春はあなたのクラスに注意を払いません。したがって、

  • 2)はありません
  • 3)Springが管理するBeanのみ
  • 4)Springはコンテナであるため、Springsの責任です

質問1)。これはこのように機能するため、Spring InjectedEntityManagerを使用すると効果的なスレッド保存になります。

于 2012-04-30T08:35:23.230 に答える