理解JPA和EJB 3以及Web服务

时间:2010-02-17 21:39:27

标签: java web-services jpa java-ee ejb-3.0

我刚开始使用JPA,从JPA实体创建无状态会话bean,然后通过Web服务访问bean。虽然我有很多以“旧方式”开发数据库支持的Web服务的经验,但我对使用这种新的“注释驱动方法”幕后发生的事情有一些疑问。

我看到的是,NetBeans引导您通过他们的向导以这种方式构建应用程序。

  1. 使用EJB和Web应用程序模块创建企业应用程序。
  2. 创建实体类。我是从现有的数据库创建的。
  3. 从实体类创建会话bean。
  4. 从会话bean创建Web服务。
  5. 一切看起来都很简单,但幕后发生了什么?具体做法是:

    1. 我看到Web服务(使用@WebService注释创建)引用了我的无状态会话bean(使用@EJB引用)。
      • 这里发生了什么?它只是从应用程序服务器的EJB池中获取EJB实例吗?
        没关系。我想的是一个实例,其中有超过1个表 - 意味着超过1种类型的Entity类和超过1种类型的EJB。我正在查看Web服务,只看到@EJB引用,并且不明白从该注释获取bean类型的人。然而,就在它之下,它是对本地bean接口的引用 - 就是那样。
      • 如果服务器部署了多于一种类型的EJB,它如何知道要抓取哪一种?
    2. EJB是通过@Stateless@Local注释定义的。 bean实现通过EnityManager注释引用@PersistenceContext
      • 完成对数据库的jndi查找(可能在persistence.xml文件中)?
      • 是否所有EJB共享一个公共EntityManager(假设EntityManager是线程安全的)?如果没有,我知道EnityManager利用二级缓存来帮助减少数据库的访问,这些缓存是否保持同步?
    3. 我知道这是很多问题,但它们都是相关的,并且似乎有许多复杂的概念,这些概念很容易通过向导构建。我想确保我理解这里发生了什么。

      提前致谢!

1 个答案:

答案 0 :(得分:4)

  

这里发生了什么?它只是从应用程序服务器的EJB池中获取EJB实例吗?

JAX-WS Web组件端点(与JAX-WS EJB端点相对)遵循典型的servlet线程模型,这意味着通常会有一个并发执行的实例为每个客户。 JAX-WS实现可以自由地利用bean实例池以类似于无状态会话EJB组件的方式处理请求。(来源:开发Java的应用程序 TM < / sup> EE平台FJ-310)。

在所有情况下,注入/查找无状态bean都可以,因为容器可以保证bean始终是线程安全的。在有效的情况下,容器会自动序列化客户端调用,但使用实例池来确保您仍然获得并发优势。

  

如果服务器上部署了多个EJB,那么它如何知道要抓取哪个?

嗯......我没有得到这个。你能澄清一下你的意思吗?为什么会有歧义?

  

完成对数据库的jndi查找(可能在persistence.xml文件中)?

在Java EE环境中,您在<jta-data-source>文件的每个持久性单元中的persistence.xml元素中指定数据源(可以包含多个持久性单元),并且将通过以下方式获取数据源: EntityManager(仅在需要时,即仅在确实需要数据访问时)。

  

所有EJB是否共享一个共同的EntityManager

没有。 EntityManager是一个非线程安全的对象,应该使用一次,对于单个业务流程,单个工作单元,然后丢弃。在使用EJB 3的Java EE环境中,默认模式是“entitymanager-per-request”。来自客户端的请求被发送到EJB 3持久层,打开一个新的EntityManager,并且在此工作单元中执行所有数据库操作。一旦完成工作(并且已准备好客户端的响应),就会刷新并关闭持久化上下文,以及实体管理器对象。(来源:Chapter 4. Transactions and Concurrency)。