gpt4 book ai didi

java - 谷歌应用引擎: Poor Performance with JDO + Datastore

转载 作者:行者123 更新时间:2023-11-30 05:59:41 25 4
gpt4 key购买 nike

我有一个简单的数据模型,其中包括

用户:存储基本信息( key 、姓名、电话号码等)

关系:描述,例如两个用户之间的友谊(提供relationship_type + 两个用户 key )

评论:由用户发布( key 、评论文本、user_id)

例如,如果我尝试打印用户所有 friend 的名字,我的性能会非常差。假设用户有 500 个 friend :我可以在单个查询中非常轻松地获取 friend user_ids 列表。但是,为了提取名字,我必须对数据存储进行 500 次来回访问,每次似乎需要 30 毫秒左右。如果这是 SQL,我只需执行 JOIN 即可快速得到答案。

我知道有一些基本的设施可以在 JDO 的宽松实现中跨无主关系执行双向连接(如 http://gae-java-persistence.blogspot.com 中所述),但它们听起来是实验性的和非标准的(例如,我的代码将无法工作)在任何其他 JDO 实现中)。

更糟糕的是,如果我想提取用户 friend 发布的所有评论怎么办?然后我需要从 User --> Relation --> Comments 获取,即三向连接,这在实验上甚至不支持。 500 次来回获取好友列表+另外 500 次查看是否有来自用户好友的评论的开销已经足以将运行时间推至超过 30 秒。

人们如何在现实世界的数据存储支持的 JDO 应用程序中处理这些问题? (或者他们确实如此?)

在这种(非常常见)的情况下,有人设法从 JDO/数据存储中获得令人满意的性能吗?

-波什

最佳答案

首先,对于经常访问的对象(例如用户),我依赖于内存缓存。这应该会大大加快您的应用程序的速度。

如果您必须访问数据存储区,正确的方法应该是通过 getObjectsById()。不幸的是,它看起来像 GAE doesn't optimize this call 。但是,对键的 contains() 查询是 optimized一次获取数据存储中的所有对象,因此您应该使用:

List myFriendKeys = fetchFriendKeys();
Query query = pm.newQuery(User.class, ":p.contains(key)");
query.execute(myFriendKeys);

您还可以依赖接受多个 key 的低级 API get(),或者像我一样使用 objectify .

一种完全不同的方法是在列表属性上使用相等过滤器。如果列表中的任何项匹配,这将匹配。因此,如果您的用户实体中有 friendOf 列表属性,则可以发出单个查询 friendOf == theUser。您可能想检查一下:http://www.scribd.com/doc/16952419/Building-scalable-complex-apps-on-App-Engine

关于java - 谷歌应用引擎: Poor Performance with JDO + Datastore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com