Glassfish-3.1.2 - 我可以将EntityManager注入无状态bean

时间:2012-07-04 10:36:56

标签: concurrency glassfish stateless

我在下面的博客中看到了有关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辅导教程中看到的代码类似,所以它应该是o.k. (FaceServlets使用@PersistnceContext EntityManager调用无状态Request bean。)

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

对于使用Oracle数据库的Glassfish-3.1.2,这是正确的假设吗?到目前为止似乎工作正常,但也许它不会在重负荷下工作。

提前感谢任何见解。对不起,我是这样的新手。 菲奥娜

Servlet
{
@EJB
private StatelessbeanBlah
:
}

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

1 个答案:

答案 0 :(得分:1)

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

  

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

     

...

     

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

(参考Managing Entities, Java EE 6 Tutorial

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