gpt4 book ai didi

performance - findBy 出现更新数据库

转载 作者:行者123 更新时间:2023-12-02 14:23:22 25 4
gpt4 key购买 nike

我有以下代码:

println "@@@@@@@@ RUNNING ProfessionaCustomer - ${pcCounter} under ${accountCustomer.customerNumber}  Professional SQLid ${it.id}"
def professionalCustomerId = it.customerId
def professionalCustomer = ProfessionalCustomer.findByCustomerNumber(professionalCustomerId)

我有 SQL 登录,我得到:
@@@@@@@@ RUNNING ProfessionaCustomer - 31 under 106450  Professional SQLid 100759
Hibernate: update base_domain set version=?, account_name=?, address_line1=?, address_line2=?, city=?, customer_number=?, date_created=?, disabled=?, last_updated=?, postal_code=?, primary_phone=?, state_or_province=? where id=? and version=?
Hibernate: update base_domain set version=?, address1=?, address2=?, city=?, customer_number=?, date_created=?, disabled=?, first_name=?, last_name=?, last_updated=?, middle_name=?, phone_number=?, postal_code=?, state=? where id=? and version=?
Hibernate: insert into account_customer_professionals (account_customer_id, professional_customer_id) values (?, ?)
Hibernate: select this_.id as id1_3_0_, this_.version as version2_3_0_, this_.address1 as address70_3_0_, this_.address2 as address71_3_0_, this_.city as city7_3_0_, this_.customer_number as customer8_3_0_, this_.date_created as date_cre9_3_0_, this_.disabled as disable10_3_0_, this_.first_name as first_n19_3_0_, this_.last_name as last_na20_3_0_, this_.last_updated as last_up11_3_0_, this_.middle_name as middle_72_3_0_, this_.phone_number as phone_n73_3_0_, this_.postal_code as postal_12_3_0_, this_.state as state74_3_0_ from base_domain this_ where this_.class='com.eveo.nplate.model.ProfessionalCustomer' and this_.customer_number=? limit ?

这是更新数据库。这可以解释为什么这会如此缓慢,但我看不出有任何原因发生这种情况。

为什么“findBy”会导致更新?

最佳答案

Hibernate 不会立即执行创建、更新或删除,直到它认为它必须这样做——它会尽可能地等待(尽管它相当悲观),并且只会在你告诉它时或它认为它需要时刷新这些更改。一般来说,唯一一次在没有显式调用的情况下刷新是在运行查询时。这是因为内存中的任何新实例、更新实例和已删除实例(缓存在 Hibernate Session 中,一级缓存中)都可能影响查询结果,因此必须将它们刷新到数据库中,以便您获得查询的正确结果。

一个异常(exception)是调用 save()在一个新实例上。 Grails 会刷新这一点,因为通常 id 是由数据库分配的,通​​过自动增量列或序列。为了确保内存中的状态与数据库相同,它会刷新 save()调用,以便它可以检索 id 并将其设置在实例中。但是,如果您检索持久性实例(例如,使用 get() 调用,或使用条件查询、查找器等)并修改它,调用 save()不会自动刷新。 delete() 也是如此。通话 - 没有刷新。

想想delete()save()调用持久实例作为 Hibernate 的消息,表明该操作应该“最终”执行。

因此,当您执行查找器、条件、“位置”或 HQL 查询时,Hibernate 将为您刷新任何未刷新的更改。如果您不希望这种情况发生(例如在自定义域类验证器闭包中),您可以在单独的 session 中运行查询,例如与 withNewSession方法。

如果您根本不刷新 session ,或者在 Session 上明确显示实例或添加 flush:truesavedelete调用, session 将被刷新,因为 Grails 注册了一个 OpenSessionInView 拦截器,该拦截器在每个请求开始时启动 session ,并在结束时刷新并关闭它。这有助于延迟加载;因为有一个 session 打开并绑定(bind)到 ThreadLocal在已知位置,Hibernate 和 GORM(通过 Spring 的 HibernateTemplate )可以使用该打开的 session 在查询运行后按需检索延迟加载的集合和实例。

另请注意,您不需要在事务中刷新。事务管理器是 Spring HibernateTransactionManager在提交之前刷新。

关于performance - findBy 出现更新数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27858407/

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