实时数据Web应用程序设计

时间:2010-11-04 17:12:31

标签: asp.net sql-server-2008 database-design web-applications concurrency

我即将开始设计具有以下特征的个人项目架构:

  1. 基本上是一个“游戏”,包含几个基于运动的并发用户。
  2. 定期模拟此项运动中的比赛,并将结果存储在数据库中。
  3. 用户可以在模拟匹配发生时查看“实时”的详细信息,并在发生后查看结果。
  4. 我开发了一个类似的Web应用程序,其范围远小于此项目的上一次迭代。然而,在这种情况下,我选择使用SQLite作为我的数据库提供程序,因为我还有一个可再发行的桌面应用程序,可用于手动模拟匹配(事实上,它作为Web应用程序之外的独立模拟器运行)。我的约束现在已经转变为只是一个Web应用程序,所以我不必担心这种额外的复杂性。

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

    我将使用的工具是:

    1. 用于Web应用程序的ASP.NET。
    2. 数据库的SQL Server 2008 R2 ...可能带有用于对象关系映射的NHibernate层。
    3. 我的问题是,我如何设计这个,以便实现最佳效率和并发访问?显然从文件转移到实际的数据库服务器会有好处,但是我需要有两个冗余服务器 - 一个用于模拟过程,一个用于Web服务器过程?

      任何建议都将不胜感激!

      感谢。

1 个答案:

答案 0 :(得分:1)

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

你应该记住一些事情:

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