0

总而言之,我有一个代码可以在数据存储中写入一些内容,并且在我调用检索刚刚写入数据存储的数据后立即进行操作。我的第二个电话总是失败!但是,如果我再次拨打电话,它可以正常工作并找到数据!真的是连线!代码在 1.7.1 上运行良好,这在我升级到 1.7.2 后开始发生(不能 100% 确定,因为我同时还做了一些其他更改,但我想我也提到了) . 这是我编写数据的代码:

    PersistenceManager pm = PMF.get().getPersistenceManager();
    pm.evictAll();
    Key userKey = KeyFactory.createKey(User.class.getSimpleName(), request.getUsername());
    try {
        User user = pm.getObjectById(User.class,userKey);
        if (!user.getPassword().equals(request.getPassword())){
            ret.setCode(ResultInfo.WRONG_PASSWORD);
        }else{
            ret.setCode(ResultInfo.FINE);
            UUID sid = UUID.randomUUID();
            ret.setCredit(user.getCredit());
            ret.setSid(sid.toString());
            ret.setUsername(user.getUsername());
            ret.setName(user.getName());
            user.setSid(sid.toString());
            user.setLastLogin(new Date());
        }
    } catch (Exception e) {
        ret.setCode(ResultInfo.USER_NOT_FOUND);
    }finally{
        pm.flush();
        pm.close();
    }

这是读取数据的代码:

    PersistenceManager pm = PMF.get().getPersistenceManager();
    pm.evictAll();
    try {
           User user = getUserForSession(pm, sid);
        if (user==null){
            ret.setCode(ResultInfo.SESSION_NOT_FOUND);              
        }else{
            ret.setCode(ResultInfo.FINE);
            ret.setCredit(user.getCredit());
            ret.setSid(sid.toString());
            ret.setUsername(user.getUsername());
            ret.setName(user.getName());
            if (user.getGid()!=null){
                Game game = getGameByGameId(pm, user.getGid());
                ret.populateGameResult(user,game);
            }
        }
    } catch (Exception e) {
        ret.setCode(ResultInfo.USER_NOT_FOUND);
    } finally{
        pm.flush();
        pm.close();
    }

getUserForSession 只需使用以下代码来检索用户:

static public User getUserForSession(PersistenceManager pm,String sid){
Query q = pm.newQuery(User.class);
q.setFilter("sid == sidParam");
q.declareParameters("String sidParam");
    try {
        List<User> users = (List<User>) q.execute(sid);
        if (users.size()!=1){
            return null;
        }else{
            return users.get(0);
        }
    } catch (Exception e) {
        return null;
    } finally {
    }

}

当我在这个函数中调试时,列表的大小在第一次调用时为零,在下次调用时为 1,参数完全相同!结果,我总是在第一次调用时收到 SESSION_NOT_FOUND 错误,而在第二次调用时,我得到了我想要的数据!

第二个代码段由 Ajax 调用,所以现在我已经更改了代码以检查错误并再次调用!我不喜欢它,我想知道如何解决这个问题。这是我的 Ajax 代码:

function fetchUserInfo(){
    var sid = getCookie("sid");
    var urlStr = BURL + '/game/' + sid + "/gameInfo";
    $.ajax({
        type:'POST',
        url: urlStr,
        dataType: 'json',
        data: null,
        contentType: "application/json; charset=utf-8",
        success: function(data) {
            console.debug(data);
            if (data.code == "OK"){
                try{
                    $("#client_name").html(data.name);
                    $("#client_credit").html(data.credit);
                }catch(e){
                }
            }else{
                fetchUserInfo();
            }
        },
        error: function(data){
            alert("Error");
        }               
    });

    }

任何帮助/指针表示赞赏

阿米尔

4

2 回答 2

1

写入 HRD 时,在持久化数据和能够读取数据之间存在延迟。

您需要将此因素考虑到您的设计中。

于 2012-10-02T16:17:03.400 回答
0

正如伊恩所说,您必须处理这种延迟。这是解决方案:当您第一次将 User 实例存储在数据存储中时,使用 makePersistent() 方法,然后使用 detachCopy() 来获取一个您也可以放入 memcache 的实例。然后,您的 fetchUserInfo() 将首先从内存缓存中获取用户。如果未找到 (==null),则从数据存储中获取。

于 2013-01-20T10:33:00.143 回答