AppEngine持久对象延迟?

问题描述:

我的情况如下:
我有我的表中的会话列表。
在我的代码中,我会检查数据存储区中的最后一个会话是否有空间存在于一个aditional播放器中。
如果不创建新的会话。AppEngine持久对象延迟?

它去有点像这样:

public Session getEligeableSession(){ 
    Session session; 
    session = ds.getLastSession(); 
    if(session.numPlayers > 3){ 
     newSession(); 
     session = ds.getLastSession(); 
    } 
    return session; 
} 

这完美的作品在当地,但它不会AppEngine上的appspot。
在AppSpot上,我刚刚收到一个填满的会话,我必须从中得出结论,我的代码不会等待新会话完全持续,只是再次获得旧会话。

我的结论是正确的吗?如果是这样,我将如何去解决这个恩惠。
寻找这个'延迟'导致谷歌/ SO上没有任何东西,这让我相信没有这样的事情(又名它是同步的),并且在我的代码中有一个不同的失败(也许从列表中获取最后一个对象在AppEngine上的工作方式不同)

任何和所有帮助/建议非常感谢。

摘要:

会议(对象)有(列表)4个播放器(对象)
getLastSession()检索来自数据存储的整个列表,并获得了最后一个(大小-1)。
newSession()创建一个新的Session对象并保存它。每个请求

编辑:

public List<Session> getAll(){ 
    pm = PMF.get().getPersistenceManager(); 
    String query = "select from " + Session.class.getName(); 
    @SuppressWarnings("unchecked") 
    List<Session> sessions = (List<Session>) pm.newQuery(query).execute(); 
    return sessions; 
} 


public Session getLastSession(){ 
    List<Session> sessions = getAll(); 
    Session session = sessions.get(sessions.size()-1); 
    session.activeGame = session.numPlayers == 4 ? true : false; 
    pm.close(); 
    return session; 
} 


    public int insert(Session session){ 
    pm = PMF.get().getPersistenceManager(); 
    int status = 0; 
    try { 
     pm.makePersistent(session); 
    } finally { 
     pm.close(); 
    } 
    return status; 
} 

代码似乎 '合理的',没有有趣的东西发生AFAIK。 我正在使用主从选项。

+0

什么newsession的实施和getLastSession?实际的代码在这里很重要!而且,您是否使用高复制数据存储? – 2011-05-09 18:50:55

+0

@Nick Johnson 我已根据要求更新了我的帖子。忘记:NewSession只是插入(新会话); – Rohan 2011-05-09 19:02:17

+0

您是否试过将单个持久性管理器传递给所有函数,而不是在每个函数中创建一个新的? – 2011-05-09 19:04:02

这里只是一个猜测,因为我不知道你是如何实现你的方法的,但是如果你在两个不同的servlet中使用两个不同的实例PersistenceManager(一个存储对象,一个存取对象),您可能会一个接一个地访问两个不同的服务器,但没有足够的时间在整个数据存储服务器上复制数据。

看看还在为另一种解释在此线程的第一个回复(虽然,这取决于如何newSession();的作品,它可能不会是这样):

http://groups.google.com/group/google-appengine/browse_thread/thread/2b4f6ec57031f53c/fc967c034e4a113f