Grails:更新域中的单个对象,".save"Vs".executeUpdate"

Dax*_*xon 4 grails hql save

我想知道从数据库中的一行更新域类中的单个值的最有效方法是什么.可以说域类有20多个字段

    def itemId = 1

    def item = Item.get(itemId)
    itemId.itemUsage += 1
    Item.executeUpdate("update Item set itemUsage=(:itemUsage) where id =(:itemId)", [usageCount: itemId.itemUsage, itemId: itemId.id])

    vs

    def item = Item.get(itemId)
    itemId.itemUsage += 1
    itemId.save(flush:true)
Run Code Online (Sandbox Code Playgroud)

Bur*_*ith 7

如果未更新字段的大小和数量很大(并且这是主观的),则executeUpdate更有效.这也是我经常删除实例的方式,运行'从Foo中删除id = 123',因为我完全加载实例只是为了调用它上面的delete()似乎很浪费.

如果您的域类中有大字符串并使用get()和save()方法,那么当您需要更改的所有字段都是一个字段时,您将所有这些数据从数据库序列化到Web服务器两次.

如果您正在使用它,则需要考虑对二级缓存的影响(如果您编辑很多实例,则可能不应该这样做).使用executeUpdate,它将刷新之前使用get()加载的所有实例,但如果使用get + save进行更新,则只刷新该实例.如果你是群集的话,这会变得更糟,因为在执行executeUpdate之后,你要清除所有各种群集节点缓存,而不是刷新所有节点上的一个实例.

最好的办法是对两种方法进行基准测试.如果您没有超载数据库,那么您可能会过早地进行优化,并且在解决其他问题时使用标准方法可能最好保持简单.