gpt4 book ai didi

grails - 在 Grails 应用程序中成功保存到数据库后,页面刷新 (F5) 会更改屏幕上的数据

转载 作者:行者123 更新时间:2023-12-02 06:47:58 25 4
gpt4 key购买 nike

我为遗留数据库开发了一个grails/groovy应用程序,它具有用于(添加、编辑)用户信息的用户维护页面。该页面使用 editinplace 和 ajax 来更新信息。

程序已经在本地测试没有问题。但是,在任何远程服务器(alpha、beta、prod)上,当我“更新”用户的任何属性时,它会将其保存在数据库中,但当我刷新页面时,内容“有时”会返回以前的值。如果我继续按刷新(F5),它将在新旧值之间切换,没有任何特定的趋势。 (无法在本地重现)

我认为这可能是缓存问题,因此我在用户域上将缓存设置为 false

class User {
static hasMany = [notes: Note]
static mapping = {
table 'MICR_USERS'
cache false
version false
id generator:'sequence', column:'SEQ_ID', params:[sequence:'MICR_USR']
lineOfBusiness column:'LOB_APP_CODE'
authorityProfile column:'AUTH_PRIVILEGE_LEVEL', lazy:false
}
...

我认为可能导致问题的另一件事是列表操作中的 createCriteria,我也在那里将缓存设置为 false

    def list = {
def f = getUserList(session.oldSearchUserTextBox?:null)
return [list:f,oldSearchKeyword:session.oldSearchUserTextBox]
}

private getUserList(String searchFilter){
....
def c = User.createCriteria()
def results
if (searchFilter) {
results = c.list (max: params.max, offset: params.offset) {
or {
ilike ("oraAcct", "%"+ searchFilter+"%" )
ilike ("lastName", "%"+ searchFilter+"%" )
ilike ("firstName", "%"+ searchFilter+"%" )
}
order("oraAcct", "asc")
cache false
}
}
else {
results = c.list (max: params.max, offset: params.offset) {
cache false
order("oraAcct", "asc")
}
}
[userInstanceList : results,userInstanceTotal :results.getTotalCount()]
}

这是我的保存方法

    private JSON saveValidateObj(def myUser,def oldValue,def fieldname,def returnFieldName){
try {
def value = myUser."$fieldname"
if( myUser.validate() && myUser.save(flush:true) ) {
if (returnFieldName) value = value."$returnFieldName"
flashMessage = getMess('user.information.update.success',[
myUser.oraAcct,
oldValue,
value
])

def json = ['value':value,'id':params.id,'updatedField': fieldname,'errorList':null,'errMessage':null,'okMessage':flashMessage]
def j = json as JSON
return j
}

......

似乎休眠保留了不同版本的数据,并且通过随机刷新页面将显示这些版本之一。然而,最新的值占主导地位并且出现得更频繁,但仍然看到旧的值出现在屏幕上,这是毁灭性的。

这些是我所做的步骤,但没有帮助1-关闭缓存(检查休眠统计信息以确保其关闭) 缓存.use_second_level_cache=false cache.use_query_cache=false

2-在不同的浏览器中尝试过

3-清理浏览器缓存并删除co​​okie

我也对 websphere 表示怀疑,它是我的生产服务器,我的本地服务器是 apache,但真的不知道为什么它会这样 react

Grails/休眠 1.1

我仍然有这个问题,想不出其他的办法。如果有人能给我任何提示,我很感激

新发现

如果我使用从用户中选择 u.id、u.sysAcct、u.firstName、u.lastName、u.mailAddress、u.phoneExt...
问题就解决了。但如果我使用从用户u中选择u,...问题将会再次发生。由于某种原因,如果我返回 User 对象,就会发生此问题。 getUserListHSQLStatic 和 getUserListHSQL 基本相同,只是一个返回对象,一个返回字段。按 F5 键静态值永远不会改变,但对象(用户)值会改变。

    private getUserListHSQLStatic(params){
def filter = params.filter
def newlist
def count
def query = """
select
u.id, u.sysAcct, u.firstName, u.lastName, u.mailAddress, u.phoneExt
,lob.name,auth.name
from User u, AuthorityProfile auth, LineOfBusiness lob
where u.authorityProfile = auth.id
and u.lineOfBusiness = lob.id
and u.sysAcct not like '%DUMMY%'
"""
if (filter){
query +="""
and (u.sysAcct like :filter or
u.sysAcct like :lfilter or
u.firstName like :filter or
u.firstName like :lfilter or
u.lastName like :filter or
u.lastName like :lfilter
) order by u.sysAcct asc
"""
def filterMap = [filter:"%${filter.toUpperCase()}%",lfilter:"%${filter.toLowerCase()}%"]
newlist = User.executeQuery(query,filterMap,
[ max:params?.max?.toInteger()?:10, offset:params?.offset?.toInteger()?:0]
)
count = User.executeQuery(query,filterMap).size()
}
else {
query += " order by u.sysAcct asc "
newlist = User.executeQuery(query,[max:params?.max?.toInteger()?:10, offset:params?.offset?.toInteger()?:0])
count = User.executeQuery(query).size()
}
[userInstanceList:newlist,userInstanceTotal:count]
}
private getUserListHSQL(params){
def mysession = sessionFactory.currentSession
if (params.reset=="true"){
println "clear session"
mysession.clear()
}

def filter = params.filter
def newlist
def count
def query = """
select u
from User u, AuthorityProfile auth, LineOfBusiness lob
where u.authorityProfile = auth.id
and u.lineOfBusiness = lob.id
and u.sysAcct not like '%DUMMY%'
"""
if (filter){
query +="""
and (u.sysAcct like :filter or
u.sysAcct like :lfilter or
u.firstName like :filter or
u.firstName like :lfilter or
u.lastName like :filter or
u.lastName like :lfilter
) order by u.sysAcct asc
"""
def filterMap = [filter:"%${filter.toUpperCase()}%",lfilter:"%${filter.toLowerCase()}%"]
newlist = User.executeQuery(query,filterMap,
[ max:params?.max?.toInteger()?:10, offset:params?.offset?.toInteger()?:0]
)
count = User.executeQuery(query,filterMap).size()
}
else {
query += " order by u.sysAcct asc "
newlist = User.executeQuery(query,[max:params?.max?.toInteger()?:10, offset:params?.offset?.toInteger()?:0])
count = User.executeQuery(query).size()
}
[userInstanceList:newlist,userInstanceTotal:count]
}

最佳答案

其他环境中是否有多个服务器?另外,当你刷新时,使用Firebug之类的工具可以检查响应代码不是304吗?最后,当你说清除浏览器缓存时,清除缓存后得到的是旧值吗?

由于您使用“就地编辑”,您正在检索的页面通常会被浏览器缓存(如果您使用的是 Chrome,我发现它的做法几乎过于激进)。我想确保服务器正在线路上传回旧数据。

关于grails - 在 Grails 应用程序中成功保存到数据库后,页面刷新 (F5) 会更改屏幕上的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5421868/

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