【发布时间】:2018-08-02 09:36:55
【问题描述】:
我正在开发一个系统来处理消息并相应地更新数据库,但我需要在层之间保持一定程度的隔离。我想到了以下内容。
-
MyDao.java:提供数据库访问的@Statelessbean。MyDao使用 JPA 访问数据库,EntityManager由@PersistenceContext注入。 -
MyMdb.java:侦听队列的 MDB。MyMdb通过与@EJB注入使用MyDao。
MyMdb.onMessage() 的一次执行需要对数据库执行多次访问,包括读取和写入。
- 一方面,这让我认为
@Statelessbean 不是MyDao的正确选择:MyDao中的EntityManager实例可以被MyMdb.onMessage()的不同执行随机访问,导致线程相互干扰。 - 另一方面,JPA 文档说注入的
EntityManager只是一个代理:它操作的实际持久性上下文 是绑定到 JTA 事务的。这样一切都应该没问题,因为即使 EntityManager 是“共享的”,每个 MDB 也会有不同的事务正在进行,因此可以安全隔离。
什么是正确的场景?我错过了什么吗?
【问题讨论】:
标签: java jpa jta message-driven-bean