【发布时间】:2011-10-20 09:47:18
【问题描述】:
我是谷歌应用引擎的新手。我正在阅读昨天的应用引擎。我对请求超时期间的写入事务有疑问。
假设我正在创建 10,000 个对象并尝试通过这样的单个事务(假设 DatastoreService 就像一个 Hibernate 事务)来保存它
String greeting = "test";
String guestBookName = "default";
DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
Key guestBookKey = KeyFactory.createKey("GuestBook", guestBookName);
for(int i=0;i<10000;i++)
{
Entity entity = new Entity("Greeting", guestBookKey);
entity.setProperty("date", new Date());
entity.setProperty("greeting", greeting);
datastoreService.put(entity);
}
假设保存1000个对象后,请求超时会删除1000个对象吗?
我已在应用引擎上运行此代码,在将 1164 个对象保存到数据存储区后,请求超时。我收到了这个错误
....Uncaught exception from servlet
com.google.apphosting.api.DeadlineExceededException: This request (0000000000000000)
started at 2011/10/20 07:18:36.726 UTC and was still executing at 2011/10/20 07:19:36.143 UTC.....
对象未从数据存储中删除。此外我读到here
数据存储可以在单个事务中执行多个操作。根据定义,除非事务中的每个操作都成功,否则事务不能成功。如果任何操作失败,事务将自动回滚。这对于分布式 Web 应用程序特别有用,其中多个用户可能同时访问或操作相同的数据。
谁能帮我清楚地理解这一点。
提前谢谢大家。
【问题讨论】:
-
在阅读了网络上的各种帖子后,我想我找到了问题的答案。我正在考虑执行以下操作 编写一个 catch 块,每当时间到时,记录“i”的值并再次发送重定向到发送“i”作为参数的同一请求。现在,如果参数存在于 url 中,则取“i”的值并保存其余对象。方法对吗?
-
更好的方法是在任务队列中执行此操作,而不是面向用户的请求。此外,将所有实体放在一个实体组中将对您可以支持的更新速率施加严格限制。
-
谢谢@NickJohnson。能否请您给我一个适当的链接,我可以获得更多详细信息?