0

我将要开始设计一个个人项目,该项目具有以下特点的架构:包含基于运动几个并发用户实时数据的Web应用程序设计

  1. 基本上是一个“游戏”。
  2. 这项运动中的比赛定期进行模拟,其结果存储在数据库中。
  3. 用户可以查看模拟匹配“live”的详细信息,并在发生后查看结果。

我开发了一个类似的Web应用程序,其范围远小于此项目的前一次迭代。然而,在这种情况下,我选择使用SQLite作为我的数据库提供者,因为我还有一个可用于手动模拟匹配的可再发行桌面应用程序(实际上,它是作为Web应用程序之外的独立模拟器运行的)。我的限制现在已经转移到只是一个Web应用程序,所以我不必担心这种额外的复杂性。

我与我以前执行的主要问题是处理并发请求。我犯了一个错误,即使用一个数据库(由磁盘上的单个文件表示)为模拟方面(在服务器上的单独进程中运行)和Web应用程序提供支持。因此,当用户同时访问网站并进行实时模拟时,由于一个进程被锁定,所以存在各种各样的数据库访问问题。我通过在数据库操作上实现跨进程互斥来解决这个问题,但这大大降低了网站的性能。

我将使用的工具有:

  1. ASP.NET Web应用程序。
  2. SQL Server 2008 R2的数据库...可能与一个NHibernate层的对象关系映射。

我的问题是,我如何设计这个,这样我会实现最佳效率以及并发访问?显然,从文件转移到实际的数据库服务器会有积极的一面,但我是否需要有两个冗余的服务器 - 一个用于模拟过程,另一个用于Web服务器进程?

任何建议,将不胜感激!

谢谢。

回答

1

你应该在同一个数据库上都做得很好。并发访问是现代数据库引擎的设计目的。同时读取通常没有问题;并发写入锁定最小可能数量的数据(一个表,甚至只是一些行),而不是整个数据库。

有几件事情,你应该记住,虽然:

  • 使用事务明智地。一方面,交易是确保数据库始终保持一致的重要工具 - 简而言之,交易要么完全发生,要么根本不发生。另一方面,两个并发事务可能导致死锁,并且这些bugger可能非常难以调试。
  • 规范化,并使用约束来保护您的数据完整性。执行外键可以节省一天的时间,即使它经常导致更麻烦的管理。
  • 尽量减少数据访问的时间:不要在你不需要它们时保持连接,确保你没有泄漏任何连接,不要获取你不需要的数据,在SQL中执行尽可能多的与数据相关的处理(特别是可以使用连接,子查询,分组,视图等解决的事情),而不是代码
+0

感谢您的答案和提示。你有没有使用NHibernate的经验?由于> 90%的数据可能会通过对象映射存储,我是否需要明确地担心这些事情? – sohum 2010-11-04 18:10:48

+0

我对NHibernate没有太多经验,但是从我所知道的情况来看,如果让NHibernate会话保持短暂的状态,你应该没问题。规范化点与ORM无关,因此无论如何您都应该这样做。 – tdammers 2010-11-05 10:45:53