Обновление счетчиков через Hibernate - PullRequest
7 голосов
/ 26 мая 2010

Это очень распространенная ситуация, поэтому я ожидаю хорошего решения. В основном нам нужно обновить счетчики в наших таблицах. Например, посещение веб-страницы:

Web_Page
--------
Id
Url
Visit_Count

Так что в спящем режиме у нас может быть такой код:

webPage.setVisitCount(webPage.getVisitCount()+1);

Проблема с чтениями в mysql по умолчанию - не обращайте внимания на транзакции. Таким образом, веб-страница с высокой посещаемостью будет иметь неточные подсчеты.

Я привык делать такие вещи просто по телефону:

update Web_Page set Visit_Count=Visit_Count+1 where Id=12345;

Наверное, мой вопрос: как мне это сделать в Hibernate? А во-вторых, как я могу сделать такое обновление в Hibernate, которое немного сложнее?

update Web_Page wp set wp.Visit_Count=(select stats.Visits from Statistics stats where stats.Web_Page_Id=wp.Id) + 1 where Id=12345;

Ответы [ 2 ]

5 голосов
/ 26 мая 2010

Проблема с чтениями в mysql по умолчанию - не обращайте внимания на транзакции. Таким образом, веб-страница с высокой посещаемостью будет иметь неточные подсчеты.

Действительно. Я бы использовал здесь операцию в стиле DML (см. Главу 13.4. Операции в стиле DML ):

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update webPage wp set wp.visitCount = wp.visitCount + 1 where wp.id = :id";
int updatedEntities = s.createQuery( hqlUpdate )
        .setLong( "newName", 1234l )
        .executeUpdate();
tx.commit();
session.close();

Что должно привести к

update Web_Page set Visit_Count=Visit_Count+1 where Id=12345;

А во-вторых, как я могу сделать подобное обновление в Hibernate, которое немного сложнее?

Хм ... Я испытываю желание сказать "ты облажался" ... мне нужно больше об этом думать.

0 голосов
/ 26 мая 2010

A хранимая процедура предлагает несколько преимуществ:

  1. В случае изменения схемы код не нужно менять, если он был call increment($id)
  2. Проблемы с параллелизмом могут быть локализованы.
  3. Ускоренное выполнение во многих случаях.

Возможная реализация:

create procedure increment (IN id integer)
begin
    update web_page
      set visit_count = visit_count + 1
      where `id` = id;
end
...