gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:22:10 26 4
gpt4 key购买 nike

我想知道从数据库中的行更新域类中的单个值的最有效方法是什么。假设域类有 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)

最佳答案

如果未更新字段的大小和数量很大(这是主观的),executeUpdate 会更有效。这也是我经常删除实例的方式,运行“delete from Foo where id=123”,因为对我来说,完全加载实例只是为了在其上调用 delete() 似乎很浪费。

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

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

最好的选择是对这两种方法进行基准测试。如果您没有使数据库过载,那么您可能会过早地进行优化,并且在解决其他问题时使用标准方法可能是让事情变得简单的最佳选择。

关于Grails:更新域中的单个对象, ".save"与 ".executeUpdate",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com