Spring Web Flow 2中流管理的持久化:事务性Web流的持久化策略 - 编程入门网
persist() 或 entityManager.merge() 方法后。这很有必要,因为持久化上下文中的每个托管(持久化)实体都必须被指定一个标识符。要避免这种提前刷新,需要将 ID 生成策略设置为 sequence。
另一方面,在视图层 Spring bean 上指定 @Transactional(readOnly=true) 将覆盖服务 bean 上的读/写事务设置;事务将保持只读状态以防止提前刷新。在 SOAP/REST Web 服务通信中绕过整个 Web 层的情况下,应用到服务 bean 的 @Transactional 注释确保 Web 服务调用运行在数据库事务内。 这是在流管理持久化中使用只读事务优于使用非事务性数据访问的地方。 如上所示,流管理持久化解决了涉及原子 Web 流的用例。本文剩余部分将重点介绍调用非原子 Web 流的用例,其中未应用流管理持久化。注意在其中的某些用例中我们仍然能够使用流作用域的持久化上下文对象。 非原子 Web 流 从业务流程管理 (BPM) 角度而言,一种长期运行的进程比典型的 Web 会话存活时间长。如果此类长期运行的进程涉及了人类的任务,则用户可以在该进程中工作任意长的时间,并且可以在几小时、几天甚至几个月之后回来恢复进程的执行。显然,此类进程应该在服务器崩溃时也可以存活。 所有这些因素都表明每一次进程运行后长期进程的状态都需要持久保存到后端数据库。将此长期运行进程的人类活动实现为 Web 流成为一个明智的技术解决方案。流将在不同的 Web 会话中重复执行以模仿长期进程的生命周期。 除了上述场景,还有一些应用程序由非上下文 Web 页组成,用户可以在这些 Web 页之间任意导航。这些 Web 页可以根据其业务功能被分组成流,即使没有逻辑顺序流也没有开始或结束状态。每个用户请求期间所做的数据变更都要被保存。这些应用程序中的持久化编程与上述长期运行的进程没有什么不同,事务原子性的作用域都划定到每个用户操作而不是一系列用户操作 — 一个 Web 流。 非原子 Web 流用例 在医疗卫生行业,服务提供商定期接触患有慢性病的成员以评估他们的健康状况和潜在风险。健康提供商随后为其提供治疗和行为健康方面的建议。这称为 案例管理。 案例管理系统围绕着一系列联系任务。在一个典型任务中,案例经理会通过电话联系一个成员,询问评估问题并根据其回答给出适当的建议、创建转诊请求、记录联系结果和设置后续任务。 情况非常复杂。评估问题清单可能很长:电话可能由于各种原因而被中断、没有记录转诊某些任务可能无法完成等等。包含并发或异步操作的联系任务是一个长期运行的进程,每一步进展都要被保存到数据库。联系任务可以被模拟为单一的 Web 流,在长期运行进程的发展过程中,它可以被重复进入和执行。 Spring Web Flow 文档没有介绍此非原子 Web 流场景。在此用例中仍然可以利用流作用域的持久化上下文对象吗?答案是可以。 Spring Web Flow 2中流管理的持久化:事务性Web流的持久化策略(5)时间:2012-02-26 IBM Xinyu Liu指定事务的作用域 我们知道流定义文件中的 <persistence-context/> 标签为我们提供了一个绑定到线程的 flowScoped 持久化上下文,这带来了没有分离实体 和没有 LazyInitializationException 异常的好处。因此,我们选择保留这个标签。与原子流中流管理的持久化相比,事务作用域发生的最大变化时:原子性应用于进程的每一步而不是整个流。通常,进程中的原子步骤是由 Web 流定义中的 <transition> 标签表示的一个用户操作。 令人失望的是 Spring Web Flow 在其任何标签上都不支持事务分界,包括 <transition> 和 <evaluate>。开发人员的下一个选择是从注释有 @Transactional 的 Spring bean 方法发起数据库事务并从 <evaluate> 标签调用该方法(<transition> 标签不支 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |