2009-06-13 162 views
3

我不知道這是否有可能改變基於應用程序正在運行的域在ASP.net用於SessionState會的sqlConnectionString?ASP.Net會話狀態

場景;我們有20個站點從一個應用程序運行,全部與不同的數據庫交談,具體取決於他們正在瀏覽哪個域(站點)。

當瀏覽www.domain1.com應用會談到數據庫「DB1」。另一方面,www.domain2.com網站會與數據庫'db2'進行對話,從而選擇相關內容並將負載分散到每個數據庫,而不是使用一個主數據庫來處理站點的所有連接。

雖然已經出現了一個問題 - 對於此設置,我們使用SessionState的SqlServer模式,以便所有站點會話的所有用戶都存儲在1個aspstate數據庫中,現在當網站變得繁忙/網站數量增加時,處理所有網站的所有會話請求的壓力越來越大,並且我們在與此數據庫的連接存在瓶頸的情況下開始出現一些超時錯誤。

我們可以從他們自己的應用程序獨立出來的網站,並建立不同的應用程序使用相同的代碼,但每個應用程序中設置的每個Web.config不同的會話數據庫,從而減輕負載。這項任務雖然會相當耗時,並且會導致長期更多的管理。所以......我很想知道在創建會話對象之前,是否可以在代碼中修改用於基於域的SessionState的sqlConnectionString?我們可以從System.Web.HttpApplication繼承並使用Application_AcquireRequestState事件創建HttpSessionState對象的必需設置嗎?

希望這是有道理的,並且有人可以提供一些指引,並證明給我看,這是不是一個白日夢!

乾杯, 史蒂夫

回答

2

我認爲你錯過了一個重點 - 如果瓶頸是SQL服務器,將事物放置在同一臺服務器上的單獨數據庫中並不會有所幫助 - 它可能是SQL運行空間不足或網絡用盡帶寬。我會試着弄清楚在做任何事之前哪一個。

0

您可以實現自定義會話狀態提供。詳情請參閱MSDN。我從來沒有做過,但有一點運氣,你可以包裝SqlServer會話狀態模塊,並重定向它基於域

0
  • 首先,我沒有看到有優勢「我會愛要知道在創建會話對象之前,是否可以在代碼中修改用於基於域的SessionState的sqlConnectionString「與在web.config中設置相比較。
  • 其次,我認爲你需要改變App_Start是連接字符串設置,因此所有的請求都會使用,改變了settings.Application_AcquireRequestState可能爲時已晚了這一點。
+0

我認爲有用於所有20個領域一個web.config中...... – chris166 2009-06-13 12:29:25

0

爲什麼不把網站分成多個網頁應用程序,並使用hostheader來區分網站。通過這種方式,您可以輕鬆配置希望Web應用程序使用哪個會話數據庫,因爲每個Web應用程序都有獨立的web.config文件。

0

我們有幾十個開發站點,其數據庫連接通過項目的主Web.Config進行處理。

有一個單獨的配置部分對應於我們內部網上的每個URL(例如http://development11,http://development12)。我們有一個具有類似命名約定的SQL實例(DEVDB1 \ SQL1,DEVDB1 \ SQL2)。

根據Intranet IIS服務器上配置的URL,應用程序抓取相應的配置。對於測試,我們可以輕鬆修改用戶,數據庫服務器或用於特定站點的個人數據庫。

2

你的問題是沒有這麼多,到數據庫的連接瓶頸,它的你是鋪天蓋地,從所有會話的數據網絡連接到數據庫。

默認情況下,Sql Server狀態提供程序只是序列化數據並將其發送到數據庫。這非常低效,需要很長時間才能在快速網絡上傳輸。

我們通過將定製的提供者,像DOTSS它運送到數據庫之前壓縮會議內容解決了這個問題。我們看到的壓縮率是80%-90%,壓縮時間小於10ms。

+0

非常有趣的傑夫,我會看看到DOTSS,謝謝 – Stibstibstib 2009-06-14 08:17:41