我是NHibernate的新手,并且在设置当前网站时遇到困难。这个网站将运行在多个网络服务器与一个数据库服务器,这让我面临一些并发问题。 该网站将有估计50,000用户左右注册,并且每个用户将有一个配置文件页面。在此页面上,其他用户可以“喜欢”其他用户,非常像Facebook。这是并发性问题。NHibernate - 具有并发和二级缓存的计数器
我想使用二级缓存,很可能使用MemChached提供程序,因为我将拥有多个Web服务器。使用NHibernate实现这种'Like'功能的最佳方式是什么?我在考虑三种选择:
- 使用简单的Count()查询。将会有一个'User_Likes'表,其中每行代表一个用户到另一个用户。要显示喜欢的数字的数量,我只需要问一个用户的喜欢数量,这个数字可以简单地翻译成数据库
SELECT COUNT(*) FROM USER_LIKES WHERE ID = x
或其他东西。但是,我收集到的数据会带来很大的性能损失,因为每次用户访问配置文件页面时都会像其他用户一样,必须重新计算喜欢的数量,以及是否需要二级缓存。 - 在用户表中使用额外的
NumberOfLikes
列,并在用户喜欢或不喜欢其他用户时增加/减少此值。然而,这给我并发问题。使用一个简单的for循环,我在两台服务器上通过一次用户1000次来测试它,结果在db总共大约为1100。这相差900。无论是否现实的测试,这当然不是一种选择。现在,我看到乐观和悲观的锁定作为一个解决方案(是吗?),但我目前的仓库模式,目前,不适合使用这个我害怕,所以在我修复之前,我想知道这是否是正确的路要走。 - 与2一样,但是使用自定义HQL并自己编写更新语句,这些内容与
UPDATE User SET NumberOfLikes = NumberOfLikes + 1 WHERE id = x
一致。这不会给我数据库中的任何并发问题吗?但是,我不确定是否会由于第二级缓存而在我的多个服务器上有任何datamischch。
所以......我真的需要一些建议。还有其他选择吗?这感觉就像一个普遍的情况,肯定NHibernate必须以优雅的方式支持这一点。 我是NHIbernate的新手,所以一个清晰,详细的答复是必要和赞赏:-)谢谢!
谢谢。我问另一个问题:http://stackoverflow.com/questions/4253998/nhibernate-pessimistic-locking-not-working这需要解决之前,我知道如果这是要走的路。 – Razzie 2010-11-23 08:23:31
@Razzie - 增加了一个答案。 – 2010-11-23 08:33:11