grails - Grails 2.5.1 domain.get(id)获取缓存的数据

标签 grails groovy

我是新手,熟悉杂项。
Grails 2.5.1版
Groovy版本2.4.5
我的问题是:
我在customerController中有一个更新方法。

customerController:

def update(){
   def map = [:]
   def customerId = params.id
   def newCustomer = request.JSON
   def customer = customerService.updateCustomer(customerId, newCustomer)

   customer.validate()

   if (customer== null) {
       map['success'] = false
       map['message'] = "Record not found"

       return map
   }

   if (customer.save()) {
       map['success'] = true
       map['data'] = customer
   } else {
       validateErrorService.extractErrors(customer, map)
   }

   return map
}

在更新方法中,我调用customerService.updateCustomer

客户服务:
def updateCustomer(customerId, newCustomer){
    def customer = Customer.get(customerId)

    if (customer == null) {
        return null
    }
    verifyLead(newCustomer.leadId)

    customer.firstName = newCustomer.firstName
    customer.lastName = newCustomer.lastName
    if(!customer.hasErrors())
        customer.save(flush:true)

    return customer
}

然后我调用verifyLead方法来更新Lead域
def verifyLead(jsonLead, userId){
    Long leadId = jsonLead.id as Long
    Lead lead = Lead.get(leadId)

    lead.status = "Proceed"
    lead.save(flush: true)
}

导域法
Lead.get(leadId)返回旧的(缓存的)数据
所以当我保存:
lead.save(flush:true)
它错误hibernate.object.staleException

最佳答案

(我在这里推测,因为我不知道您的设置)

简短答案:
当域对象(在您的情况下为Lead)背后的数据库记录在上次从数据库读取到您的save()调用之间已更新时,通常会发生StaleObjectStateException(我想是您得到的)。
根据您的设置,它可能是Grails应用程序的第二个实例。

一种可能的解决方案是悲观锁定(请参阅Grails文档中的7.3.5 Pessimistic and Optimistic Locking)。

更长的答案(如果您已经了解更多技术背景,请问:)get()从底层的Hibernate session 返回一个域对象。该 session 无法自动识别数据库中的更改。
因此,如果数据库发生更改,则您的Hibernate session 中的数据可能会过时。
GORM(Grails的DB层)通常使用乐观锁定(尝试保存并增加DB记录的version字段的值)。

如果您的代码尝试保存的域对象的版本小于数据库中对象的版本,那么GORM / Hibernate认为抛出异常比更新记录并破坏新的更改更好。

使用悲观锁定,您的代码将首先锁定数据库记录或表,然后更新记录,最后释放锁定。

但请注意:悲观锁定会带来自身的问题。

关于grails - Grails 2.5.1 domain.get(id)获取缓存的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52197216/

相关文章:

grails - 与Grails插件不兼容?

grails - 用于多对一的归属的Grails表单创建

xml - 使用XPath查询提取XML

json - Groovy 调用/循环遍历 JSON 对象

groovy - Geb-core 3.2 与 groovy 2.5.8 冲突

multithreading - 如何使用Grails 2.3.11在后台运行线程

java - 排除从 Grails 中的查询中检索 'id'

grails - 如何创建一个返回多变量数据管道 “grid”的方法?

amazon-web-services - 为什么 grails websockets 连接失败,但在使用 AWS ELB 时继续接收浏览器中已订阅的消息?

groovy - 如何定义一个接受参数化闭包作为参数的 Groovy 函数?