我刚开始使用JPA,从JPA实体创建无状态会话bean,然后通过Web服务访问bean。虽然我有很多以“旧方式”开发数据库支持的Web服务的经验,但我对使用这种新的“注释驱动方法”幕后发生的事情有一些疑问。
我看到的是,NetBeans引导您通过他们的向导以这种方式构建应用程序。
一切看起来都很简单,但幕后发生了什么?具体做法是:
@WebService
注释创建)引用了我的无状态会话bean(使用@EJB
引用)。
@EJB
引用,并且不明白从该注释获取bean类型的人。然而,就在它之下,它是对本地bean接口的引用 - 就是那样。 @Stateless
和@Local
注释定义的。 bean实现通过EnityManager
注释引用@PersistenceContext
。
persistence.xml
文件中)? EntityManager
(假设EntityManager
是线程安全的)?如果没有,我知道EnityManager
利用二级缓存来帮助减少数据库的访问,这些缓存是否保持同步?我知道这是很多问题,但它们都是相关的,并且似乎有许多复杂的概念,这些概念很容易通过向导构建。我想确保我理解这里发生了什么。
提前致谢!
答案 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)。