0

我在下面看到了这个博客,关于 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 实现中编写的代码。见下文。我认为它类似于我在 Duke 辅导教程中看到的代码,所以应该没问题(FaceServlets 使用 @PersistnceContext EntityManager 调用无状态请求 bean。)

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

这是对带有 Oracle 数据库的 Glassfish-3.1.2 的正确假设吗?到目前为止,它似乎工作得很好,但也许它不会承受重载。

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

Servlet
{
@EJB
private StatelessbeanBlah
:
}

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

1 回答 1

1

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

EntityManager 实例的持久性上下文由容器自动传播到在单个 Java Transaction API (JTA) 事务中使用 EntityManager 实例的所有应用程序组件。

...

通过自动传播持久性上下文,应用程序组件不需要将 EntityManager 实例的引用传递给彼此,以便在单个事务中进行更改。Java EE 容器管理容器管理的实体管理器的生命周期。

(参考管理实体,Java EE 6 教程

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

于 2012-07-04T12:41:46.080 回答