2009-11-24 35 views
0

安裝程序:ASP.net 3.5,Linq-to-Sql。單獨的Web和DB服務器(每個8核,8GB RAM)。 4個數據庫。我正在使用幾百萬條記錄到DB4中進行插入操作(現在使用Linq-to-Sql,儘管我可能會切換到SqlBulkCopy)。日誌記錄顯示記錄一直以600-700每秒的速度保存(我每運行1000條記錄就運行DataContext.SubmitChanges()以減小事務大小)。插入在一個Http請求期間運行(超時設置非常高)。爲什麼批量插入會導致ASP.net應用程序無響應?

問題是,在插入操作正在運行時,Web應用程序變爲完全無響應(均位於我的計算機上的不同瀏覽器窗口以及遠程位置的其他瀏覽器中)。

此插入操作正在觸摸DB4中的一個表。大多數頁面只會觸及DB1(所以我不認爲這是一個鎖定問題 - 我也通過Management Studio檢入,並且沒有對象被不必要地鎖定)。我已經檢查過Web和數據庫服務器上的性能統計數據,雖然它們可能會不時高峯,但在整個插入過程中,它們都保持在「綠色」範圍內。

什麼可以導致應用成爲的事情,我應該爲了縮小問題做反應遲鈍或建議的任何想法?

迴應建議:

  • 建議,即插入所有正在使用DB連接:插件正在關閉不同的連接字符串(和DB)比使用應用的哪些網頁中完成的。此外,我檢查了SSMS,並且只有一個連接爲DB4打開,另一個打開爲DB1(因此它看起來不像連接不足)。
  • 建議在Web服務器上插入最大CPU:這是服務器上唯一的應用程序(每次少於5個用戶)。性能監視器顯示CPU保持在12%-20%之間。記憶很難被感動。

回答

0

最終解決方案:我通過DataTable將數據插入從LinqToSql更改爲使用SqlBulkCopy。我第一次這樣做時,在試圖在內存中創建200萬行數據表時遇到了OutOfMemory異常。因此,我一次添加50,000行,並使用SqlBulkCopy(批量:10,000)將它們加載到數據庫中,然後清除DataTable行集合。我現在在108秒內獲得了210萬行(每秒約20,000個;昨晚的速率是L2S平均每秒200個)。隨着數據插入性能的提高,應用程序範圍內的無響應已經消失。

1

我的第一個猜想是,你使用了可用的連接與你正在做的和Web應用程序正在等待獲取數據庫連接的插入操作數據庫。

您有幾個選項。

  1. 看在SSMS,看看你有常規負載下打開和活動連接,做當插入看看這是一個問題。
  2. 使用分析工具如螞蟻Profiler來看看是怎麼回事在減慢的時間Web應用程序,它可以幫助確定問題。
  3. 您也可以嘗試在SQL Server上手動執行Web應用程序正在使用的查詢,並查看您是否注意到類似的行爲。

另一種選擇,不太可能,但它可能是Web應用程序進行大容量插入,它從服務器上的其他Web應用程序獲取所有CPU時間,從而阻止使用。如果您還沒有這樣做,請將應用程序拆分到自己的池中,以便監控其負載。

+0

以上對你的一些建議添加了回覆 –

+0

根據你的意見,那麼我會推薦我的清單中的第2項......因爲這是唯一有意義的東西。 –

1

我不知道的LINQ到SQL,但NHibernate的具體規定,使用它對於批量插入是一個壞主意。我在ADO中發現了數組綁定。NET非常快,Here is an article解釋瞭如何使用Oracle,但它也應該與其他提供者一起工作。

1

似乎在web應用程序中執行長操作是個壞主意(例如,您的IIS服務器可能會無緣無故地重新啓動應用程序)。將您的長期應用程序拆分爲Web App和Service App。在Service App中執行長時間的操作。通過WCF &管道進行溝通。

0

有可能你有一個鎖定語句在你的Web應用程序中的某些地方在你將數據加載到數據庫的整個過程中阻塞了一些重要的數據。

相關問題