【问题标题】:Glassfish-3.1.2 - Can I inject EntityManger into a stateless beanGlassfish-3.1.2 - 我可以将 EntityManger 注入到无状态 bean 中吗
【发布时间】:2012-07-04 10:36:55
【问题描述】:

我在下面看到了这个博客,关于 Servlet 和将 EJB 注入其中。 作者是从标准的角度来写的。

http://tamanmohamed.blogspot.ie/2012/03/jpa-why-we-need-to-specifies-type-level.html http://tamanmohamed.blogspot.ie/2012/03/jpa-thread-safety-when-injecting.html

“将 EJB 3 有状态 bean 注入 servlet 实例字段不是线程安全的。同样,将带有 @PersistenceContext 的 EntityManager 注入 servlet 实例变量也不是线程安全的。EntityManager 只是不是设计为线程安全的。安全。”

不管怎样,我开始担心我和一位同事一起编写的代码 Glassfish-3.1.2 实现。见下文。 我认为它类似于我在杜克辅导教程中看到的代码,所以应该没问题。 (其中 FaceServlets 使用 @PersistnceContext EntityManager 调用无状态请求 bean。)

但是我想我假设容器管理的 EntityManager 能够应对 由许多 servlet 实例调用的无状态 bean 的大量并发调用。

对于带有 Oracle 数据库的 Glassfish-3.1.2,这是一个正确的假设吗?到目前为止,它似乎运行良好,但可能无法承受重载。

提前感谢您提供任何见解。对不起,我对这个很陌生。 菲奥娜

Servlet
{
@EJB
private StatelessbeanBlah
:
}

@Stateless
StatelessBeanBlah
{
@PersistenceContext(unitname = "...")
private EntityManager em;

【问题讨论】:

    标签: concurrency glassfish stateless


    【解决方案1】:

    您的问题有些混乱,因为 EntityManager 实例的线程安全取决于您使用的是Container-Managed Entity Managers 还是Application-Managed Entity Managers。在第一种情况下,

    EntityManager 实例的持久化上下文是自动的 由容器传播到所有使用 单个 Java 事务 API (JTA) 中的 EntityManager 实例 交易。

    ...

    通过自动传播持久化上下文,应用程序组件无需相互传递对 EntityManager 实例的引用即可在单个事务中进行更改。 Java EE 容器管理容器管理的实体管理器的生命周期。

    (参考Managing Entities, Java EE 6 Tutorial

    尝试在您的 persistence.xml 文件中定义一个可识别 JTA 的数据源,看看会发生什么。我不热衷于将持久性上下文注入 servlet,因为在开发 Java EE 6 Web 应用程序时有 JSF,并且在大多数情况下您不需要创建自己的 servlet,而且我对这项技术还很陌生, 也。但是,将持久性上下文注入到托管 bean 或企业 bean(如无状态 EJB)中,使用 JTA 感知数据源,绝对没问题并且线程安全。

    【讨论】:

    • 谢谢。因此,一旦数据源是“JTA-aware”,代码 -> Servlet 调用已注入对 EntityManager 的引用的无状态 Bean 就可以了。是的,我检查了persistence.xml,它(具有JTA 的事务类型)很好。再次感谢。
    • 欢迎您!如果您认为答案有用,您可以接受和/或投票。
    • 我不能投票,因为它说我没有足够的声誉。对于那个很抱歉。不过我接受了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多