2013年10月27日 星期日

ASP timeout Error=80040E31

ASP timeout Error=80040E31

http://www.programmer-club.com/ShowSameTitleN/asp/4128.html



因為執行 Store Procedure 耗費很多時間 , 所以我執行
oRS.open "exec sp_dpas",,"DSN=DPAS;uid=xxxx;pwd=oooo"
有時候會產生 這樣的錯誤訊息
Microsoft OLE DB Provider For ODBC Drivers Error '80040e31' 
[Microsoft][ODBC SQL Server Driver]Timeout expired 
/amas/LotList/LotList.asp, line 49 

我在 lotlist.asp 中加入了 " Server.ScriptTimeout = 20000 "
, 我也更改了 IIS 中的 asp script timeout 設定 ,
還是沒有辦法解決 .
有別的方法改進 , 或是我哪裡設定錯誤呢 ?

========================================================================
資料庫會 Timeout 的問題, 除非你的資料量龐大到幾 GB, 而且又沒有做完善的 Index 規劃才會發生外, 其餘大部分的情況都是因為你採用的 ADODB 資料庫開啟的模式不正確, 因此在 ASP 回圈內 Dump 資料需要不斷跟 SQLServer 要求每筆的每個欄位而發生 Timeout 的情況

強烈建議你改用 Offline Recordset (Disconnect Recordset), 可以解決大部分 ASP 令人煩惱的問題(例如容易發生莫名其妙的錯誤導致整個 IIS 完全無法動作, 甚至讓虛擬主機業者影響到其他客戶的專案, 或者像您這種 Timeout 的問題)

我曾經在聊天室的專案內測試過(平均上線人數是 20 人, 資料庫使用 Access), 還沒使用 Offline Recordset 的聊天室, 大約 5-30 分會當機一次, 最長紀錄撐到大約 10 小時當機
改用 Offline Recordset, 架設超過半年, 還沒有因為資料庫存取問題而當機過

目前我大部分的 ASP 專案都可允許超過 2000 人同時上線存取, 其實最主要的功勞都在 Offline Recordset 上面, 建議您參考看看

========================================================================
可否解釋一下什麼是Offline Recordset ,如何用?

========================================================================
Offline Recordset 是在你取得資料的時候, 將 RS 與資料庫的連線中斷, 但是讓 RS 仍然能對已經取得的資料做存取跟修改
好處就是速度快, 不會因為每次的抓取欄位都要跟資料庫要求, 因此也讓資料庫負擔變輕
不過因為是離線修改資料, 因此想要把 RS 裡面的值回存到資料庫去的時候, 需要重新建立連線, 多一到手續, 但是我的看法是很值得...

附上我自己寫的模組給您參考, 不過您得自備 ADOVBS.INC
這個模組只有三個 Function:
GetRecordset 傳入 ConnectionString (就是 Provider=SQLOLEDB;Initial Catalog....... 這個連接資料庫的字串), 跟 SQLString (就是 Select* FROM ......), 傳出 Recordset
目的是利用 Offline Recordset 的概念取得資料庫的資料

SubmitRS 傳入 ConnectionString 跟 RS (就是 Recordset)
目的將已經修改過的 Recordset 存入資料庫

ExecuteSQL 跟 GetRecordset 類似, 用途是在執行某些不會傳回 Recordset, 但是會造成大量影響的指令, 例如刪除一堆資料...


========================================================================
-----------------------
ADOVBS.INC 將他 函入 當成coding 一部分

------------------------
Offline Recordset 
.....重點就是要切斷 connection 但是 , 在更新資料時 , 回有資料一致性的問題
就是, Recordset.Open 後將 Connection.Close
等你 update 完後 在Connection.Open
Recordset .UPDATE
------------------------
至於這一點,ㄟ,看書吧,把 aDo 搞懂你就知了

========================================================================
(Offline Recordset,這樣對嗎?)

conn.Open
RSa.Open
RSb.Open
...
RSb("name")=RSa("name")
RSb.Update
RSb.Close
RSa.Close
conn.Close

========================================================================
後來有人教我用這個方法:
Conn_sql.connectiontimeout=0
Conn_sql.commandTimeOut=0
Server.ScriptTimeOut=999999
我把上面三行放在
'建立連線
Set
 Conn_sql = server.createobject("ADODB.Connection")

Conn_sql.connectiontimeout=0
Conn_sql.commandTimeOut=0
Server.ScriptTimeOut=999999

Conn_sql.Open Application("Conn_ConnectionString"), Application("Conn_RuntimeUserName"), Application("Conn_RuntimePassword")

目前是不會發生timeout的情形,不過我只試了幾次,要等過一陣子,才有時間







沒有留言:

張貼留言