Nano Hash - криптовалюты, майнинг, программирование

Использование Objectify для одновременной записи данных в GAE

Скажем, например, у меня есть следующая модель объективации:

@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 будет вызываться следующее:

A:

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

и для другого случая:

B:

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

Если они оба считывают счетчик одновременно или считывают счетчик до того, как другой экземпляр сохранит его, они перезапишут друг друга.

В MySQL / Postgres вы получаете блокировку на уровне строк, как сделать «блокировку на уровне строк» ​​для объектов Objectify в GAE?


Ответы:


1

Вам необходимо использовать транзакции при одновременном обновлении объектов.

Обратите внимание, что, поскольку вы обновляете один и тот же объект, у вас будет ограничение примерно на 1 запись в секунду. Чтобы обойти это, просмотрите счетчики сегментирования.

05.06.2013
  • Спасибо, Питер, я думаю, было бы лучше вставлять новые записи и подсчитывать статистику один раз в день, а затем просто помещать их в транзакцию. 06.06.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..