我有一个grails作业,该作业计划在每天晚上运行,以更新所有用户的统计信息,分别是firstOrderDate,lastOrderDate和totalOrders。
看一下代码。
void updateOrderStatsForAllUsers(DateTime date) {
List<Order> usersByOrders = Delivery.findAllByDeliveryDateAndStatus(date, "DELIVERED")*.order
List<User> customers = usersByOrders*.customer.unique()
for (User u in customers) {
List<Order> orders = new ArrayList<Order>();
orders = u.orders?.findAll { it.status.equals("DELIVERED") }?.sort { it?.dateCreated }
if (orders?.size() > 0) {
u.firstOrderDate = orders?.first()?.dateCreated
u.lastOrderDate = orders?.last()?.dateCreated
u.totalOrders = orders.size()
u.save(flush: true)
}
}
}
运行此代码的工作是
def execute(){
long jobStartTime = System.currentTimeMillis()
emailService.sendJobStatusEmail(JOB_NAME, "STARTED", 0, null)
try {
// Daily job for updating user orders
DateTime yesterday = new DateTime().withZone(DateTimeZone.getDefault()).withTimeAtStartOfDay().minusDays(1)
userService.updateOrderStatsForAllUsers(yesterday)
emailService.sendJobStatusEmail(JOB_NAME, "FINISHED", jobStartTime, null)
}
catch (Exception e) {
emailService.sendJobStatusEmail(JOB_NAME, "FAILED", jobStartTime, e)
}
}
因此,我正在发送一封邮件,对于发生的任何异常,现在的问题是我总是在u.save()处收到“错误:OptimisticLockingException”失败邮件。对于一个日期,我有大约400个用户。
我知道为什么会发生乐观锁定,但是如您所见,我不是在循环更新同一用户记录,而是有一个不同用户的列表,并且正在迭代他们以更新所有用户。然后,如何在用户保存时得到乐观的锁定异常。救命 !
最佳答案
乐观锁定是一个休眠错误,Mango DB与之无关。
哪个实体抛出了乐观锁定异常,是客户,订单还是交货?
运行此作业时,如何确保这些实体中的任何一个都没有更新?
您如何确保一次仅触发一次该作业?
尝试添加一些日志记录以查看它是可重复的问题,方法是在上一次执行完成后再次触发作业。
更多调试可能有助于解决此问题。
关于mongodb - Grails Job | mongodb中的多个更新总是抛出乐观的锁定异常,该如何处理呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35383731/