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; 
} 

有没有人有更好的代码?