Это - чрезвычайно общая ситуация, таким образом, я ожидаю хорошее решение. В основном мы должны обновить счетчики в наших таблицах. Как пример посещение веб-страницы:
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;
Проблема заключается в чтении в 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, который является немного сложнее?
Хм ... Мне хочется сказать "ты облажался" ... нужно больше об этом подумать.
Хранимая процедура предлагает несколько преимуществ:
приращение вызова ($ id)
Возможная реализация:
create procedure increment (IN id integer)
begin
update web_page
set visit_count = visit_count + 1
where `id` = id;
end