0

如果我有2 「表」,GAE - 保存數據存儲讀取

「表播放器」,(字段 - PlayerKey,PlayerName,PlayerUrlPhoto) 「表PlayerGames」,(字段 - PlayerGameKey,PlayerKey,GameDate)

如果我想列出所有遊戲,我將在「PlayerGames」中創建一個查詢,並顯示「Players」信息,我將不得不「GetObjectbyID」來讀取PlayerName和PLayerUrlPhoto。

這樣做的最好方法是什麼?

1 - 使用GetObjectByID纔是正道(花1「的數據存儲讀」多爲每個「PlayerGame」記錄) 2 - 在「PlayerGames」我知道田店,我將需要在未來清單? (如playername和playerurlphoto,保存「數據存儲讀」讓球員信息) 3 - 其他方式...

  • 提醒的是,玩家可以改變他的名字和他的照片,所以如果我存儲的名稱和在「PlayerGames」的照片,我將不得不更新所有記錄。 (並會花費大量的DataStore寫入)

有人可以給我一個小費嗎?

thx

回答

0

這聽起來像你只需要在你的實體前使用memcache。當您通過密鑰獲取播放器實體時,首先使用從數據存儲區密鑰計算的密鑰來檢查內存緩存,如果存在值,請使用它。否則,請執行數據存儲讀取,然後將結果存儲在內存緩存中以供將來使用。這將大大減少數據存儲讀取的次數。

當播放器更新她的記錄時,只需在更新數據存儲記錄後刪除memcache值即可。這會強制下一次讀取轉到數據存儲,並更新緩存。

+0

感謝丹,那正是我想要的,我只需要有人來確認MemCache可以解決我的問題=) – LeandroRezende 2012-02-01 16:39:05

0

我用「returnmemcache」替換「GetObjectByID」。

我做了一個簡單的功能是這樣的:

public Object returnmemcache(Class class,Key key) 
{ 
    Cache cache = null; 
    Object returntemp = null; 
    try { 
     CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory(); 
     cache = cacheFactory.createCache(Collections.emptyMap()); 
     returntemp = cache.get(key); 
     if (returntemp==null) 
     { 
      PersistenceManager pm = PMF.get().getPersistenceManager(); 
      returntemp=pm.getObjectById(class,key); 
        pm.close(); 
      cache.put(key, returntemp); 
     } 
    } catch (CacheException e) { 
     PersistenceManager pm = PMF.get().getPersistenceManager(); 
     returntemp=pm.getObjectById(class.getClass(),key); 
      pm.close(); 
    } 
    return returntemp; 
} 

有沒有人有更好的代碼?