gpt4 book ai didi

sql-server - Hibernate4,Grails 2.5-缓存的数据在两次重启之间仍然存在吗?

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

我在Grails 2.5.0应用程序中遇到了一个Hibernate4缓存的奇怪问题,该应用程序充当从旧系统迁移数据的平台。迁移涉及数据库记录的直接数据库插入和删除(同时测试迁移SQL)。这些操作在系统中导致页面加载错误,因为缓存的数据与数据库的实际状态不同。特定失败页面加载上的Stacktrace错误表示缺少记录,这些记录的ID当前未被数据库中的任何外键引用。例如,一页无法呈现,并显示以下错误:

018-02-27 10:16:32,495 http-bio-8080-exec-8 | ERROR  StackTrace | superAdmin | Full Stack Trace:                                                
org.hibernate.UnresolvableObjectException: No row with the given identifier exists: [com.tlc.worx.company.CompanyQuestion#48466]
at org.hibernate.UnresolvableObjectException.throwIfNull(UnresolvableObjectException.java:68)
at org.hibernate.event.internal.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:179)
at org.hibernate.event.internal.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:61)
at org.hibernate.internal.SessionImpl.fireRefresh(SessionImpl.java:1121)
at org.hibernate.internal.SessionImpl.refresh(SessionImpl.java:1094)
at org.hibernate.internal.SessionImpl.refresh(SessionImpl.java:1089)
at org.codehaus.groovy.grails.orm.hibernate.GrailsHibernateTemplate$10.doInHibernate(GrailsHibernateTemplate.java:342)
at org.codehaus.groovy.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:188)
at org.codehaus.groovy.grails.orm.hibernate.GrailsHibernateTemplate.refresh(GrailsHibernateTemplate.java:339)
at org.codehaus.groovy.grails.orm.hibernate.GrailsHibernateTemplate.refresh(GrailsHibernateTemplate.java:335)
at org.codehaus.groovy.grails.orm.hibernate.HibernateGormInstanceApi.refresh(HibernateGormInstanceApi.groovy:150)
at com.tlc.worx.company.CompanyQuestion.refresh(CompanyQuestion.groovy)
at com.tlc.worx.company.CompanyQuestion$refresh.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:114)
at com.tlc.worx.checklist.CompanyQuestionController$_index_closure1$_closure2$_closure3.doCall(CompanyQuestionController.groovy:49)
at com.tlc.worx.checklist.CompanyQuestionController$_index_closure1$_closure2$_closure3.doCall(CompanyQuestionController.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
--

在数据库中搜索所引用的记录号只会在一个完全不相关的字段和一个Tally表中显示该记录号:

enter image description here

(请注意,遇到错误的页面与丢失的记录本身无关,而仅与可能与CompanyQuestion相关但当前不相关的对象有关)。

我怀疑有一个Hibernate缓存问题,特别是因为这与删除记录同时发生。此外,将同一数据库迁移到另一个环境进行测试不会在新环境上引起相同的错误-证实了我的理论,即这与特定于环境的缓存有关。但是奇怪的是,原始环境中的Tomcat7重新启动(应用程序在Tomcat上运行)不会导致问题消失。 Hibernate的配置如下:
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory' // Hibernate 4
singleSession = true // configure OSIV singleSession mode
flush.mode = 'auto' // pre-Hibernate4 default behavior was auto, so we'll stick with that for now. See https://grails.org/2.4.3+Release+Notes
}

是重新启动并没有导致问题消失,这让我挠了挠-是正常的Hibernate行为,即使在Tomcat重新启动之间,也可以永久地缓存内容吗?我在这里完全错过了标记吗?我的下一步是在禁用第二级缓存的第一个环境中运行该应用程序,但我也希望获得社区的反馈,即我的理论至少处于正确的轨道上-似乎很疯狂。任何建议/反馈表示赞赏!

最佳答案

想要解决这个问题,因为我最终发现了问题。

我们的应用程序利用ElasticSearch来编译一组数据以查询搜索。我们一直在应用程序重启时为ElasticSearch重新编制索引,并且之前从未遇到过此问题,但是我了解到,重新编制索引操作并不总是能够完全执行我们想要做的事情,实际上可以将旧数据索引为新记录,从而导致重复或重复。好坏记录混合。

我的问题中的错误发生在从先前的重新索引中击中“不良”,陈旧记录之一时。重新索引之前清除所有ElasticSearch索引即可解决此问题。

关于sql-server - Hibernate4,Grails 2.5-缓存的数据在两次重启之间仍然存在吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49014971/

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