ユーザー情報を(追加、編集)するためのユーザーメンテナンスページを備えたレガシーデータベース用の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
}
...
問題を引き起こす可能性があると私が考えたもう1つのことは、リストアクションの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
}
....。
hibernatedは異なるバージョンのデータを保持しているようで、ページをランダムに更新することにより、それらのバージョンの1つが表示されます。ただし、最新の値が支配的であり、より頻繁に表示されますが、それでも画面に古い値が表示されるのは壊滅的です。
これらは私が行った手順であり、助けにはなりませんでした1-キャッシュをオフにしました(休止状態の統計をチェックしてオフになっていることを確認しました)cache.use_second_level_cache = false cache.use_query_cache = false
2-別のブラウザで試してみました
3-ブラウザのキャッシュをクリーンアップし、Cookieを削除しました
また、本番サーバーであるWebsphereについても疑わしく、ローカルはApacheですが、なぜこのように反応するのか本当にわかりません。
Grails / hibernate 1.1
私はまだこの問題を抱えており、他に何も考えられませんでした。誰かが私にヒントを提供してくれるなら、私は感謝します
新しい発見
私が使用すればselect u.id, u.sysAcct, u.firstName, u.lastName, u.mailAddress, u.phoneExt from User u...
問題は解決されます。しかし、私が使用するselect u from User u,...
と、問題が再び発生します。何らかの理由でUserオブジェクトを返すと、この問題が発生します。getUserListHSQLStaticとgetUserListHSQLは基本的に同じですが、1つはオブジェクトを返し、もう1つはフィールドを返します。静的な値は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]
}