2010-11-22 55 views
2

我是NHibernate的新手,并且在设置当前网站时遇到困难。这个网站将运行在多个网络服务器与一个数据库服务器,这让我面临一些并发问题。 该网站将有估计50,000用户左右注册,并且每个用户将有一个配置文件页面。在此页面上,其他用户可以“喜欢”其他用户,非常像Facebook。这是并发性问题。NHibernate - 具有并发和二级缓存的计数器

我想使用二级缓存,很可能使用MemChached提供程序,因为我将拥有多个Web服务器。使用NHibernate实现这种'Like'功能的最佳方式是什么?我在考虑三种选择:

  1. 使用简单的Count()查询。将会有一个'User_Likes'表,其中每行代表一个用户到另一个用户。要显示喜欢的数字的数量,我只需要问一个用户的喜欢数量,这个数字可以简单地翻译成数据库SELECT COUNT(*) FROM USER_LIKES WHERE ID = x或其他东西。但是,我收集到的数据会带来很大的性能损失,因为每次用户访问配置文件页面时都会像其他用户一样,必须重新计算喜欢的数量,以及是否需要二级缓存。
  2. 在用户表中使用额外的NumberOfLikes列,并在用户喜欢或不喜欢其他用户时增加/减少此值。然而,这给我并发问题。使用一个简单的for循环,我在两台服务器上通过一次用户1000次来测试它,结果在db总共大约为1100。这相差900。无论是否现实的测试,这当然不是一种选择。现在,我看到乐观和悲观的锁定作为一个解决方案(是吗?),但我目前的仓库模式,目前,不适合使用这个我害怕,所以在我修复之前,我想知道这是否是正确的路要走。
  3. 与2一样,但是使用自定义HQL并自己编写更新语句,这些内容与UPDATE User SET NumberOfLikes = NumberOfLikes + 1 WHERE id = x一致。这不会给我数据库中的任何并发问题吗?但是,我不确定是否会由于第二级缓存而在我的多个服务器上有任何datamischch。

所以......我真的需要一些建议。还有其他选择吗?这感觉就像一个普遍的情况,肯定NHibernate必须以优雅的方式支持这一点。 我是NHIbernate的新手,所以一个清晰,详细的答复是必要和赞赏:-)谢谢!

回答

1

我怀疑你会在更多的地方看到这个问题。你可以用3.来解决这个特定的问题,但是这会让你在其他地方遇到并发问题。

我会建议实施悲观锁定。通常的做法是将事务应用于整个HTTP请求。通过Global.asax中的BeginRequest,您可以开始会话和交易。然后,在EndRequest中提交。通过Error事件,您可以选择执行回滚并放弃会话。

这是应用NHibernate的一种可以接受的方式。例如参见http://dotnetslackers.com/articles/aspnet/Configuring-NHibernate-with-ASP-NET.aspx

+0

谢谢。我问另一个问题:http://stackoverflow.com/questions/4253998/nhibernate-pessimistic-locking-not-working这需要解决之前,我知道如果这是要走的路。 – Razzie 2010-11-23 08:23:31

+0

@Razzie - 增加了一个答案。 – 2010-11-23 08:33:11

0

我会去。我相信在这种应用程序中,如果某些页面在一段时间内显示稍微过时的值,它并不那么关键。

IIRC,HQL更新做而不是使实体缓存条目无效,因此您可能必须手动执行此操作。

相关问题