2010-06-22 41 views
7

我們已經看到這個問題一段時間了,我真的試圖圍繞導致它的原因。經歷了SQL Server「超時」和「SQL Server不存在或訪問被拒絕」的經典ASP應用程序

一天幾次我們會看到網頁開始投擲的時間段[微軟] [ODBC SQL Server驅動程序]超時過期「然後不久後頁面開始投擲」[Microsoft] [ODBC SQL Server Driver] [ DBNETLIB] SQL Server不存在或訪問被拒絕。「

我們有很多不同的應用程序連接到這個數據庫服務器。它平均每秒平均有大約2500次併發連接處理。我們的大多數應用程序沒有任何問題,問題似乎只發生在Web服務器上。 (也許它與連接池有關?)

我不知道該怎麼解決這個問題。有問題的SQL服務器對於它所做的工作極其不滿,並且配備了每個處理器的許可。所以我不認爲我們正在考慮許可/性能問題。

我想也許是IP連接問題,所以我改變了ConnectionString使用IP地址並運行一些長時間ping。我在Web服務器和數據庫服務器之間丟失了0個數據包。

的ASP連接字符串現在看起來是這樣的:

Provider=MSDASQL; Driver={SQL Server}; Server=10.0.100.100; Database=DBName; UID=WebUserName; PWD=WebUserPassword; ConnectionTimeout=15; CommandTimeout=120; 

用戶使用的是SQL Server身份驗證連接非域用戶。所以我不認爲這是一個與域相關的問題。我檢查了SQL服務器的日誌文件,並沒有發現與事件相關的任何內容。

我找到描述類似行爲的another stackoverflow question,但沒有解析。

的詳細信息:

  • 的Web服務器:Windows 2003 SP2標準,IIS 6
  • 數據庫服務器:Microsoft SQL Server的9.0.4035

有沒有人見過/解決這類型問題?有沒有人有任何建議,我應該看看下一步?

謝謝!

-Zorlack

編輯

誰能告訴我最好的做法是什麼經典的高負荷ASP執行SQL查詢?我們是否想要嘗試利用連接池?

在看代碼,相當多的是這樣的:

Set objCn = Server.CreateObject("ADODB.Connection") 
objCn.Open(Application("RoConnStr")) 
'do some stuff 
objCn.Close 
Set objCn = Nothing 

溶液(每斯科特的建議)描述

This article,一個發球,我的問題。我做了註冊表更改,然後重新啓動服務器。

問題解決了!

+0

謝謝,我也有這個問題。 雖然它看起來像連接池是紅色的鯡魚。當我使用和不使用連接池進行測試時,服務器仍然創建了數千個處於TIME_WAIT狀態的TCP連接。 看起來連接池允許您重新使用連接對象,但這些連接對象有時會在服務器之間創建許多新的TCP連接。 – 2011-06-13 11:11:51

回答

7

您的Web應用程序是否關閉和處理數據庫連接(設置爲空)?

此外,您是否嘗試過使用SQLOLEDB而不是ODBC?想不出爲什麼你會在這裏使用ODBC。

這裏是一個非常繁忙的傳統的ASP應用我的連接字符串:

Dim strcConn 
strConn = "Provider=SQLOLEDB; Data Source=someserver; Initial Catalog=somedb; User ID=someuserid; Password=somepassword" 

編輯

我碰到這個博客中來了。有趣的一種。

http://www.ryanbutcher.com/2006/02/classic-asp-on-2003-server-with.html

+1

這些是我會看到的兩件事情:ODBC向連接添加不必要的抽象,並且無法回收連接是一個常見問題。 – Godeke 2010-06-22 18:00:20

+0

大多數情況下,應用程序在完成時不會將連接對象設置爲空。我當時的理解是,通過離開連接對象是可以的,因爲當頁面完成渲染時,它會超出範圍。那時連接池並沒有接管? – zorlack 2010-06-22 18:04:33

+0

查看上面的編輯 – zorlack 2010-06-22 18:14:58

0

我有這樣的問題的時候,總是與人保持數據開放的客戶端應用程序,而不commiting一個「選擇..」語句來。

不知道這是否解決了你的問題在這裏...雖然。

2

我通過重新創建存儲過程解決了這個問題!
只是一個簡單的DROP,然後CREATE在我的情況下停止超時!

我曾經患過這個問題一週;一個傳統的ASP說「SQL超時」時,我可以在不到一秒鐘內直接在數據庫上運行相同的查詢。 (儘管我沒有看到「不存在」的信息)。ASP在整整一個月內都運行良好。

我的一位天才朋友說:「通過ASP使用'緩存'執行計劃,效率不高,請嘗試刪除並重新創建,這確實表明您的存儲過程可以通過重寫來實現高效的,因爲它可能會再次發生。「

由於在使用SQL Management Studio進行測試時proc運行良好,我假定它沒有使用緩存計劃,但ASP的確如此。

+0

這是一個非常非常好的答案,需要upvotes!一直與ASP工作多年,並從未遇到這個問題(幸好,因爲我的程序沒有引起任何問題),但這是非常好的信息要記住!謝謝! – Digs 2015-03-19 08:24:50

+0

如果緩存的計劃是問題,則可以通過指定SQL明確重新評估緩存計劃來減少中斷,從而解決此問題:「exec sp_recompile'MyProcedure'」這樣可以避免出現意外更改權限的問題。 – Bruce 2017-06-28 21:52:07

相關問題