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。 我正在使用主从选项。
答
这里只是一个猜测,因为我不知道你是如何实现你的方法的,但是如果你在两个不同的servlet中使用两个不同的实例PersistenceManager
(一个存储对象,一个存取对象),您可能会一个接一个地访问两个不同的服务器,但没有足够的时间在整个数据存储服务器上复制数据。
看看还在为另一种解释在此线程的第一个回复(虽然,这取决于如何newSession();
的作品,它可能不会是这样):
什么newsession的实施和getLastSession?实际的代码在这里很重要!而且,您是否使用高复制数据存储? – 2011-05-09 18:50:55
@Nick Johnson 我已根据要求更新了我的帖子。忘记:NewSession只是插入(新会话); – Rohan 2011-05-09 19:02:17
您是否试过将单个持久性管理器传递给所有函数,而不是在每个函数中创建一个新的? – 2011-05-09 19:04:02