Android Google应用程序引擎-数据存储读取操作太多

Android Google应用程序引擎-数据存储读取操作太多,android,google-app-engine,google-cloud-datastore,quota,Android,Google App Engine,Google Cloud Datastore,Quota,我已经通过谷歌应用程序引擎为我的Android应用程序实现了在线排行榜。但两小时后,我在“数据存储读取操作”中达到了100%的配额。有人能帮我修改代码以减少读取操作吗? 这是我的密码: public class The_Big_Bang_Theory_Quiz_HighscoreserverServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws

我已经通过谷歌应用程序引擎为我的Android应用程序实现了在线排行榜。但两小时后,我在“数据存储读取操作”中达到了100%的配额。有人能帮我修改代码以减少读取操作吗?
这是我的密码:

public class The_Big_Bang_Theory_Quiz_HighscoreserverServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    String game = req.getParameter("game");
    String name = req.getParameter("name");
    String pointsStr = req.getParameter("points");
    String behaviorStr = req.getParameter("behavior");
    int behavior = 0; // 0 = upload, 1 = download
    if (behaviorStr != null) {
        try {
            behavior = Integer.parseInt(behaviorStr);
        } catch (NumberFormatException e) {
            behavior = 0;
        }
    }
    if (behavior == 0) {
        int points = 0;
        if (pointsStr != null) {
            try {
                points = Integer.parseInt(pointsStr);
            } catch (NumberFormatException e) {
                points = 0;
            }
        }
        if (points > 0 && name != null) {
            addHighscore(game, name, points);
        }
    } else {
        String maxStr = req.getParameter("max");
        int max = 1000;
        if (maxStr != null) {
            try {
                max = Integer.parseInt(maxStr);
            } catch (NumberFormatException e) {
                max = 1000;
            }
        }
        returnHighscores(resp, game, max);
    }
}

private void returnHighscores(HttpServletResponse resp, String game, int max) {
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Key gameKey = KeyFactory.createKey("game", game);
    Query query = new Query("highscore", gameKey);
    query.addSort("points", Query.SortDirection.DESCENDING);
    List<Entity> highscores = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(max));
    for(Entity e : highscores) {
        try {
            resp.getWriter().println(e.getProperty("name") + ";" +e.getProperty("points"));
        } catch (IOException exc) {
            exc.printStackTrace();
        }
    }
}

private void addHighscore(String game, String name, int points) {
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Key gameKey = KeyFactory.createKey("game", game);
    Entity highscore = new Entity("highscore", gameKey);
    highscore.setProperty("name", name);
    highscore.setProperty("points", points);
    datastore.put(highscore);
}
}
public class\u Big\u Bang\u Theory\u quick\u HighscoreserverServlet扩展了HttpServlet{
public void doGet(HttpServletRequest-req、HttpServletResponse-resp)引发IOException{
字符串游戏=req.getParameter(“游戏”);
字符串名称=req.getParameter(“名称”);
字符串点str=req.getParameter(“点”);
字符串behaviorStr=req.getParameter(“行为”);
int behavior=0;//0=上传,1=下载
if(behaviorStr!=null){
试一试{
behavior=Integer.parseInt(behaviorStr);
}捕获(数字格式){
行为=0;
}
}
如果(行为==0){
积分=0;
if(pointsStr!=null){
试一试{
points=Integer.parseInt(pointsStr);
}捕获(数字格式){
分值=0;
}
}
如果(点>0&&name!=null){
addHighscore(游戏、名称、分数);
}
}否则{
字符串maxStr=req.getParameter(“max”);
int max=1000;
如果(maxStr!=null){
试一试{
max=Integer.parseInt(maxStr);
}捕获(数字格式){
最大值=1000;
}
}
返回高分(分别、比赛、最高);
}
}
私有void returnHighscores(httpservletresp,字符串游戏,int max){
DatastoreService datastore=DatastoreServiceFactory.getDatastoreService();
Key gameKey=KeyFactory.createKey(“游戏”,游戏);
查询查询=新查询(“高分”,游戏键);
query.addSort(“点”,query.SortDirection.DESCENDING);
List highscores=datastore.prepare(query).asList(FetchOptions.Builder.withLimit(max));
对于(实体e:高分){
试一试{
resp.getWriter().println(e.getProperty(“名称”)+“;”+e.getProperty(“点”));
}捕获(IOException){
exc.printStackTrace();
}
}
}
私有void addHighscore(字符串游戏、字符串名称、整数点){
DatastoreService datastore=DatastoreServiceFactory.getDatastoreService();
Key gameKey=KeyFactory.createKey(“游戏”,游戏);
实体highscore=新实体(“highscore”,gameKey);
highscore.setProperty(“名称”,名称);
highscore.setProperty(“点”,点);
datastore.put(高分);
}
}

我读了一些关于
BlobStore
。这是一种更好的方法吗?

我也有同样的问题,我使用GEA的缓存机制来解决这个问题。 基本上,缓存是一个分布式HasMap

一些代码: 创建地图:

try {
            cache = CacheManager.getInstance().getCacheFactory().createCache(
                    new ConcurrentHashMap<String, Category>());
        } catch (CacheException e) {
            Logger
                    .getLogger(TipsDAO.class.getName())
                    .severe(
                            "unable to cretate cache using an internal ConcurrentHashMap");
            cache = new ConcurrentHashMap<String, Category>();
        }
对于数据库中的每个写操作,您也会写入映射

cache.put(cat.getName(), cat);

读操作返回的每个实体都需要读操作。在免费配额下,您有5万个阅读操作

每当你得到高分时,你似乎都能得到1000分。如果你的分数>1000,那么拉分数50次将达到你的极限

你的用户真的在乎前1000名吗?这是你的决定,但我非常怀疑。如果你获得了前10名的高分,那么在配额用完之前,你可能还有100倍的查询

节省资金的下一步是使用投影查询,以便您的读取使用小操作而不是读取操作。

仅供参考,如果您使用GAE,您可以得到一个很酷的报告,它可以准确地告诉您每个数据库事务的时间和费用

这在调试资源使用情况时非常有用


谢谢你的帖子!你能告诉我什么是“猫”吗?第二行:“cache=newConcurrentHashMap();”为什么没有类型不匹配?缓存和地图?顺致敬意,cat是我的一个域类,它都是从真实代码复制粘贴的。。。cache是MAP类型的,但它是google实现。您是否有可能将代码(例如每封邮件)发送给我,以便我更好地理解它?问候。完整的代码我不能发送给你,但请随时询问更多的信息,我会很乐意帮助你。明天我将尝试使我的代码示例更通用,也许这也会有所帮助。这个想法很简单,你可以使用映射来减少DB调用。明天我将尝试使我的代码示例更通用,这将非常有用!我不知道我是否正确地理解了整个过程。如果我把一些东西放在缓存中,那么它也会存储在数据存储中?因为如果你没有找到它,你就从DB.Cache中读取它!如果这还不够,请再缓存一些!:你能看看我的appstats吗?它说成本是0,但数据存储读取操作费一直在增加,现在20小时后为3.5美元。
cache.put(cat.getName(), cat);