3

ユーザー情報を(追加、編集)するためのユーザーメンテナンスページを備えたレガシーデータベース用の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]
}
4

2 に答える 2

2

Are there multiple servers in the other environments? Also, when you refresh, using a tool like Firebug can you check the response code isn't 304? Finally, when you say you cleared the browser cache, are you getting the old value after clearing the cache?

Since you're using Edit in Place, the page you're retrieving can often times be cached by the browser (if you're using Chrome, I've seen that it does this almost too aggressively). I'd want to make sure that the server is passing back old data on the wire.

于 2011-04-07T21:26:20.337 に答える
0

現時点では問題はまだわかっていませんが、

def query = """ select  u.id, u.sysAcct, u.firstName, u.lastName, u.mailAddress, ...

オブジェクト全体を返す代わりに。

def query = """ select u from User u, AuthorityProfile auth, LineOfBusiness lob   ...

この変更により問題が修正され、ページを更新しても値が変更されなくなりました。

于 2011-05-03T18:34:05.733 に答える