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;
}
が言うには、この正しいことにもかかわらずのSpring BeanのデフォルトのスコープSpringは
ThreadLocal
を使用してトランザクションをバインドし、EntityManager
を使用するため、EntityManager
はスレッドセーフです。上記サーブレットの例は、Springでも有効ですか?それでもスレッドセーフではありませんか?
ThreadLocal
のアプローチはSpringマネージドBeanに対してのみ機能し、プレーンサーブレットはその1つではありませんか?私が覚えている限り、
EntityManager
を注入するのはコンテナの責任です。 Glassfish Java EE実装では、注入ポイントとして@PersistenceContext
を検出したのはアプリケーションサーバーでした。
どのように春のように見えるのですか? Spring Frameworkは、これらのアノテーションを発見する責任を負うのか、それともJPA実装者の責任ですか?
ありがとうラルフ。したがって、「2)はいいです」と言うと、このサーブレットはSpring Beanではないため、スレッドセーフではないということです。実際、**注入はまったく発生しません**。このようなサーブレットをSpring Beanとしてマークすることは可能ですか?私は何とかそれは非常に珍しい、推奨されていないと乱雑なアイデアだと思う - それは春のメカニズムを理解するための単なる理論的な質問です。 –
私はそれがまったく春の豆ではないことを意味します(つまり、最初の段落についてです)。注入がないので、 'em'はnullになります。 - それがヌルでない場合は、本当に奇妙なことが起こる。 Spring Beanにしようとする方法の1つは '@ Configurable 'ですが、これは本当のAspectJを必要とし、これがサーブレットで動作するかどうかは本当に分かりません。 – Ralph