【问题标题】:Using Objectify to concurrently write data on GAE使用 Objectify 在 GAE 上并发写入数据
【发布时间】:2013-06-05 05:26:31
【问题描述】:

例如,假设我有以下对象化模型:

@Cache
@Entity
public class CompanyViews implements Serializable, Persistence {

    @Id
    private Long id;
    private Date created;
    private Date modified;
    private Long companyId;

    ........

    private Integer counter;

    ........

    @Override
    public void persist() {
        persist(false);
    }

    @Override
    public void persist(Boolean async) {
        ObjectifyService.register(Feedback.class);
        // setup some variables
        setUuid(UUID.randomUUID().toString().toUpperCase());
        setModified(new Date());
        if (getCreated() == null) {
            setCreated(new Date());
        }   
        // do the persist
        if (async) {
            ofy().save().entity(this);
        } else {
            ofy().save().entity(this).now();
        }           
    }
}

我想使用计数器字段来跟踪查看次数、打开次数或基本上使用整数字段来计数。

现在发生的情况是,对于一个 GAE 实例,将调用以下代码:

答:

CompanyViews views = CompanyViews.findByCompanyId(...);
views.setCounter(views.getCounter() + 1);
views.persist();

另外一个例子:

乙:

CompanyViews views = CompanyViews.findByCompanyId(...);
views.setCounter(views.getCounter() + 1);
views.persist();

如果它们同时读取计数器或在另一个实例持久化计数器之前读取计数器,它们将相互覆盖。

在 MySQL / Postgres 中,您获得了行级锁定,如何在 GAE 上为 Objectify 实体执行“行级锁定”?

【问题讨论】:

    标签: java google-app-engine google-cloud-datastore objectify


    【解决方案1】:

    并发更新实体时需要使用transactions

    请注意,由于您更新相同的实体,您将有大约 1 次写入/秒的限制。要解决这个问题,请查看 sharding counters

    【讨论】:

    • 谢谢彼得,我想最好每天插入新条目并计算一次统计信息,然后将其放入事务中。
    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多