Обновление счетчиков через В спящем режиме

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

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

Таким образом в в спящем режиме, у нас мог бы быть этот код:

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

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

Путем я привык делать, этот тип вещи является просто вызовом:

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

Я предполагаю, что мой вопрос, как я выполняю, которые В спящем режиме? И во-вторых, как я могу выполнить, обновление как это В спящем режиме, который немного более сложен?

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;
7
задан at. 25 May 2010 в 20:14
поделиться

2 ответа

Проблема заключается в чтении в 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, который является немного сложнее?

Хм ... Мне хочется сказать "ты облажался" ... нужно больше об этом подумать.

5
ответ дан 7 December 2019 в 12:15
поделиться

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

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

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

create procedure increment (IN id integer)
begin
    update web_page
      set visit_count = visit_count + 1
      where `id` = id;
end
0
ответ дан 7 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: