7

这是一个非常常见的情况,所以我期待一个好的解决方案。基本上我们需要更新表中的计数器。以网页访问为例:

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

所以在hibernate中,我们可能会有这样的代码:

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;
4

2 回答 2

5

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 中进行这样的更新,这有点复杂?

嗯......我很想说“你被搞砸了”......需要更多地考虑这个问题。

于 2010-05-25T21:05:51.283 回答
0

存储过程提供了几个好处:

  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
于 2010-05-25T20:36:29.467 回答