【发布时间】:2011-07-17 00:02:44
【问题描述】:
我在 Java 中有一组批处理/cron 作业,它们调用我的服务类。我也在使用 Hibernate 和 Spring。
最初批处理层总是创建一个外部事务,然后批处理作业将调用一个服务以从具有相同会话的数据库中获取对象列表,然后调用一个服务来分别处理每个对象。为我的服务层设置了一个 tx-advice 来回滚任何 throwable。因此,如果第 5 个对象出现异常,则处理的前 4 个对象也会回滚,因为它们都是同一事务的一部分。
所以我认为在批处理层中创建的这个外部事务是不必要的。我删除了它,现在我调用服务来获取对象列表。然后调用另一个服务来分别处理每个对象,如果其中一个对象失败,其他对象仍然会持续存在,因为它是每个服务调用的新事务/会话。但是我现在遇到的问题是在获取对象列表之后,当我将每个对象传递给要处理的服务时,如果我尝试获取其中一个属性,我会收到延迟初始化错误,因为会话用于加载该对象(从列表中)已关闭。
我想到的一些选项是在批处理作业中获取一个 ID 列表并将每个 ID 传递给一个服务,该服务将在该会话中检索整个对象并处理它。另一种方法是将该对象的属性的延迟加载设置为 false,但这会每次都加载所有内容,即使有时不需要嵌套属性。
我总是可以回到最初使用每个批处理作业的外部事务的方式,然后在每次调用服务以处理每个单独的对象之前在批处理作业中创建另一个事务...
这样的最佳做法是什么?
【问题讨论】:
标签: java hibernate spring session transactions