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