2011-05-09 115 views
0

我的情況如下:
我有我的表中的會話列表。
在我的代碼中,我會檢查數據存儲區中的最後一個會話是否有空間存在於一個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

回答

1

這裏只是一個猜測,因爲我不知道你是如何實現你的方法的,但是如果你在兩個不同的servlet中使用兩個不同的實例PersistenceManager(一個存儲對象,一個存取對象),您可能會一個接一個地訪問兩個不同的服務器,但沒有足夠的時間在整個數據存儲服務器上覆制數據。

看看還在爲另一種解釋在此線程的第一個回覆(雖然,這取決於如何newSession();的作品,它可能不會是這樣):

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