gpt4 book ai didi

java - 简单的 Google App Engine 数据存储操作耗时过长 : causing DeadlineExceededException/DatastoreTimeoutException

转载 作者:行者123 更新时间:2023-11-29 09:21:39 26 4
gpt4 key购买 nike

我有一个相当简单的 App Engine Java 应用程序,其中包含帐户、订单和订单项 - 没什么特别的。

就在过去的 12 小时内,我开始从一些相当直接的代码中抛出异常,这些代码将订单添加到帐户然后保存它们。

我创建了一个简单的测试 servlet 来重现这个问题,它看起来像这样:

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws IOException {

String key = req.getParameter("key");

PersistenceManager pm = PMF.get().getPersistenceManager();
Account account = pm.getObjectById(Account.class, KeyFactory.stringToKey(key));

Order order = new Order();
order.setExternalOrderID("ASHLEY-TESTING");

Item item = new Item();
item.setSku("ASHLEY-WIDGET-A");
item.setQuantity(2);
Item item2 = new Item();
item2.setSku("ASHLEY-WIDGET-B");
item2.setQuantity(2);

order.addItem(item);
order.addItem(item2);

account.addOrder(order);
order.setAccount(account);
pm.makePersistent(order);
pm.close();
}

addOrder is implemented as a pretty standard lazy init:

public void addOrder(Order order) {
if (getOrders() == null) {
setOrders(new ArrayList<Order>());
}
getOrders().add(order);
}

The relevant parts of the entities:

@PersistenceCapable

public class Account {

//...

@Persistent(mappedBy="account")
@javax.jdo.annotations.Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="orderDate desc"))
private List<Order> orders;

//...

}

and the Order has an account field:

@Persistent
private Account account;

此代码在 account.addOrder() 行失败。如果它直接在浏览器中运行,它会因 DeadlineExceededException(30 秒后)而失败,如果我将它排入队列以通过任务队列运行,它会在一两分钟后因 DatastoreTimeoutException 而失败。它在此过程中使用了大量的 CPU 时间。

我估计该帐户下的订单子(monad)项少于 2000 个,每个订单有 1-3 个 OrderItem 子项。

我的问题是,为什么这一切突然开始失败,它已经成功地添加了 1000 个已经存在的订单。我错过了重要的事情吗?我需要添加索引吗?数据存储真的这么慢吗?我是否在滥用它,我不应该与这么多 child 建立 child 关系 - 也许一组 key 会是更好的方法?

最佳答案

在google app engine 的一张幻灯片中,它提到对于列表属性,当项目编号大于“500”时,数据存储性能会很差。这张幻灯片很旧,我不确定现在的限制是否仍然相同,但这可能是您的情况的问题。不要在列表属性中存储太多项目是有意义的。在该幻灯片中,它建议用户针对这种情况使用扩展类。例如:

class Orders:
Account account // the account these order belong to.
List<Order> orders // the orders, limit to 500 items

如果您有超过 500 个订单,只需添加另一个 Orders 实例即可。

关于java - 简单的 Google App Engine 数据存储操作耗时过长 : causing DeadlineExceededException/DatastoreTimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6026614/

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