在我正在开发的项目中,我们有一个EJB后端,其中各种客户端远程连接(即Web层,Web服务层等)。客户端位于另一台计算机上,可以位于另一个数据中心,因此前端和后端永远不会位于同一个应用服务器中。
后端分层如下:
SLSB< - >服务层对象< - > DAO
除SLSB外,所有对象都是弹簧管理的。事件链如下:
初始化:
请求/响应:
在EJB上调用的方法,委托给服务对象,使用DAO,返回DTO
DAO封装了JPA实体上的所有查询操作。没有JPA实体渗透过服务层。服务层划分了事务。
使用此架构完成请求/响应生命周期后,JPA实体会发生什么?服务层是否应该尝试缓存实体,还是休眠作业?
欢迎任何关于这种架构的评论。
谢谢
答案 0 :(得分:2)
使用此架构完成请求/响应生命周期后,JPA实体会发生什么?
对于TRANSACTION作用域的容器管理持久性上下文,持久性上下文在关联的JTA事务提交或回滚并且分离了持久性上下文中的所有实体时结束。从JPA规范:
5.6.1容器管理的事务范围持久化上下文
申请可以获得 容器管理的实体管理器 事务范围的持久化上下文 绑定到JTA事务 在JNDI中注入或直接查找 命名空间。持久化上下文 实体管理器的类型是 违约或定义为
PersistenceContextType.TRANSACTION
。新的持久化上下文从何时开始 容器管理的实体管理器 在范围内调用 [36] 一个活跃的JTA交易,和 没有当前的持久性 上下文已经与 JTA交易。坚持不懈 创建上下文然后关联 与JTA交易。
持久化上下文在结束时结束 关联的JTA事务提交或 回滚,以及所有实体 由EntityManager管理成为 分离。
如果调用实体管理器 在交易范围之外, 从数据库加载的任何实体 将立即脱离 方法调用的结束。
如果应用程序不再保留引用,则将分离实体进行垃圾回收。
服务层是否应该尝试缓存实体,还是休眠作业?
如果要在各种持久性上下文(即二级(L2)缓存)中缓存实体,那么这就是JPA提供者的工作。它知道各种持久性事件,并且可以与缓存进行适当的交互。当您的JPA提供程序已经提供此功能时,在服务层级别实现类似的机制是没有意义的。对于Hibernate,请参阅19.2. The Second Level Cache。