2012-04-30 13 views
10

EntityManagerは、のスレッドセーフではないです。 サーブレット仕様では、非分散環境でSingleThreadModelを実装していないと、の定義ごとに1つのサーブレットインスタンスがしかないことが示されています。@PersistenceContext SpringとJava EEでのEntityManagerのスレッドセーフティ

したがって、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はThreadLocalを使用してトランザクションをバインドし、EntityManagerを使用するため、EntityManagerはスレッドセーフです。

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

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

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

答えて

5

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

  • 2)のための答えはノー
  • 3)のみ春は春のコンテナ質問の

あるので、それは、スプリングス責任です)豆に を管理されていない1)。このように動作するので、Spring Injected Entity Managerの使用はスレッドの有効な保存になります。

+0

ありがとうラルフ。したがって、「2)はいいです」と言うと、このサーブレットはSpring Beanではないため、スレッドセーフではないということです。実際、**注入はまったく発生しません**。このようなサーブレットをSpring Beanとしてマークすることは可能ですか?私は何とかそれは非常に珍しい、推奨されていないと乱雑なアイデアだと思う - それは春のメカニズムを理解するための単なる理論的な質問です。 –

+1

私はそれがまったく春の豆ではないことを意味します(つまり、最初の段落についてです)。注入がないので、 'em'はnullになります。 - それがヌルでない場合は、本当に奇妙なことが起こる。 Spring Beanにしようとする方法の1つは '@ Configurable 'ですが、これは本当のAspectJを必要とし、これがサーブレットで動作するかどうかは本当に分かりません。 – Ralph

関連する問題