Обновление страницы (F5) изменяет данные на экране после успешного сохранения в БД в приложении Grails - PullRequest
3 голосов
/ 24 марта 2011

Я разработал приложение 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 - отключил кеширование (проверилстатистика гибернации, чтобы убедиться, что она выключена) cache.use_second_level_cache = false cache.use_query_cache = false

2 - пробовал в разных браузерах

3 - очищал кеш браузера и удалял куки

Я также подозрительно отношусь к 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 в основном одинаковы, за исключением того, что один возвращает объект, а другой возвращает поля.значения из статического никогда не изменятся при нажатии 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]
}

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Есть ли несколько серверов в других средах? Кроме того, когда вы обновляете, используя такой инструмент, как Firebug, вы можете проверить, что код ответа не 304? Наконец, когда вы говорите, что очистили кеш браузера, вы получаете старое значение после очистки кеша

Поскольку вы используете «Редактирование на месте», получаемая страница часто может кэшироваться браузером (если вы используете Chrome, я видел, что он делает это почти слишком агрессивно). Я хочу убедиться, что сервер передает старые данные по сети.

0 голосов
/ 03 мая 2011

В настоящее время проблема все еще неизвестна, однако я смог решить проблему, используя

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

вместо возврата всего объекта.

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

Это изменение устранило мою проблему, и обновление страницы больше не будет изменять значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...