gpt4 book ai didi

java - 当以下代码包含在事务中时,为什么应用程序引擎向我收取的费用会减少?

转载 作者:行者123 更新时间:2023-11-30 04:35:10 28 4
gpt4 key购买 nike

我已经使用 appstats 多次验证了这一点。当下面的代码未包含在事务中时,JDO 执行两次数据存储读取和一次写入,3 个 RPC,成本为 240。不仅仅是第一次,每次都如此,即使每次都访问相同的记录,因此应该从缓存中提取它。然而,当我将代码包装在上面的事务中时,代码会生成 4 个 RPC:开始事务、获取、放置和提交 —— 其中,只有 Get 被计费为数据存储读取,因此总体成本为 70。

如果它从缓存中提取它,为什么它只为读取付费?看起来它会按写入收费,而不是按读取收费。应用程序引擎是否可以向我收取与数据存储区读取相同的非事务性缓存读取费用?为什么?

这是带有事务的代码:

PersistenceManager pm = PMF.getManager();
Transaction tx = pm.currentTransaction();
String responsetext = "";
try {
tx.begin();
Key userkey = obtainUserKeyFromCookie();
User u = pm.getObjectById(User.class, userkey);
Key mapkey = obtainMapKeyFromQueryString();
// this is NOT a java.util.Map, just FYI
Map currentmap = pm.getObjectById(Map.class, mapkey);
Text mapData = currentmap.getMapData(); // mapData is JSON stored in the entity
Text newMapData = parseModifyAndReturn(mapData); // transform the map
currentmap.setMapData(newMapData); // mutate the Map object
tx.commit();
responsetext = "OK";
} catch (JDOCanRetryException jdoe) {
// log jdoe
responsetext = "RETRY";
} catch (Exception e) {
// log e
responsetext = "ERROR";
} finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
resp.getWriter().println(responsetext);

这是没有事务的代码:

PersistenceManager pm = PMF.getManager();
String responsetext = "";
try {
Key userkey = obtainUserKeyFromCookie();
User u = pm.getObjectById(User.class, userkey);
Key mapkey = obtainMapKeyFromQueryString();
// this is NOT a java.util.Map, just FYI
Map currentmap = pm.getObjectById(Map.class, mapkey);
Text mapData = currentmap.getMapData(); // mapData is JSON stored in the entity
Text newMapData = parseModifyAndReturn(mapData); // transform the map
currentmap.setMapData(newMapData); // mutate the Map object
responsetext = "OK";
} catch (Exception e) {
// log e
responsetext = "ERROR";
} finally {
pm.close();
}
resp.getWriter().println(responsetext);

最佳答案

通过事务,PersistenceManager 可以知道缓存在该代码的整个处理过程中都是有效的。如果没有事务,它就不能(它不知道是否有其他操作在其背后发生并更改了内容),因此必须根据数据库表验证缓存的内容。每次检查时,都需要创建一个事务来执行此操作;这是数据库接口(interface)本身的一个功能,任何不在事务中的操作(有一些特定于数据库的异常(exception))都会自动添加一个事务。

就您而言,无论如何您都应该有一个事务,因为您希望在处理时获得一致的数据库 View 。如果没有这个,当您正在处理时,mapData 可能会被另一个操作修改,并且这些修改将悄然丢失。那会很糟糕。 (嗯,有可能。)交易是良药。

(您还应该考虑使用 AOP 来管理事务包装;这比每次自己编写所有事务管理代码要容易得多。OTOH,它会增加部署的复杂性,直到您把事情做好为止,所以我可以理解不遵循这条建议......)

关于java - 当以下代码包含在事务中时,为什么应用程序引擎向我收取的费用会减少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684250/

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