将事务包装在App Engine中的每个数据存储事件 - 读写是否存在性能风险?

时间:2010-09-25 21:40:42

标签: java database performance google-app-engine transactions

根据App Engine文档,您可以在以下事务中包装datstore事件:

import javax.jdo.Transaction;

import ClubMembers;   // not shown

// ...
        // PersistenceManager pm = ...;

        Transaction tx = pm.currentTransaction();

        try {
            tx.begin();

            ClubMembers members = pm.getObjectById(ClubMembers.class, "k12345");
            members.incrementCounterBy(1);
            pm.makePersistent(members);

            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
        }

如果您不仅包装了事务中的每个写入事件而且还包含了每个读取事件,它是否会对应用程序的性能产生负面影响?

2 个答案:

答案 0 :(得分:2)

在事务中执行读写操作肯定会有开销。

在很多情况下没有意义 - 如果您只是从数据存储区读取值,那么在事务中包装单个读取操作没有任何优势。当您有一组需要一起执行的多个操作时(例如您在问题中包含的get,increment,persist示例),保存事务。 GAE文档包含uses for transactions部分,您可能会发现它有用。

此外,批量数据存储操作通常很方便,以最大限度地减少应用程序与数据存储之间的往返次数。如果你在事务中包装每个操作,那么你将不得不单独发送每个事务(这将相当慢,特别是如果你同步地发出每个请求)。

答案 1 :(得分:1)

由于声明一个事务是更多的工作,它必须产生开销。话虽如此,我从未有过不必要的交易是导致我的业绩问题的原因。