none
請問WIN2003 x64 版本中,IIS 連結 SQL2000 的問題 RRS feed

  • 一般討論

  • 我的web主機是安裝 win2003 x64 繁體中文版,資料庫主機是 win2003 x32 繁體中文版+SQL2000 SP4
    原本web也是使用win2003 x32 繁體中文版時,在 global.asa 中可以直接宣告
    Application("conNET_ConnectionString") ="mydb" 透過 ODBC 連結 資料庫主機。

     

    但是當我把WEB主機升級到 win2003 x64 繁體中文版 之後,就不行了,只好改用
    Application("conNET_ConnectionString") = "Provider=SQLOLEDB;Data Source=SQL1;Initial Catalog=mydb;User ID=xx;Password=xxxxx"

    而原本 asp 網頁中的開啟 Recordset 的語法,並未做改變。


    但是,現在碰到一個相當困擾的問題,就是常常會發生 Recordset 開不起來,會發生逾時的錯誤訊息,或是速度變的非常慢,常常開一個網頁正常只要2秒中現在卻得等上數十秒甚至timeout ?

     

    請問這是因為再 x64 上,有 SQLOLEDB 或 odbc 版本相容性的問題嗎?

    2007年7月8日 上午 02:35

所有回覆

  • 您好

     

    可否請您將您嘗試不行的錯誤訊息貼上來嗎? 較能讓大家知道錯誤發生的原因。

     

    2007年7月10日 上午 09:26
  • 抱歉,我說的不清楚

    後來我改裝 win2003 ( WEB+SQL2000 SP4) 之後一樣有相同的情況。大致如下述

     

    一台 Web Server ( Win2003 , SP 與 線上更新都ok , IP=192.168.100.10)

    一台 SQL Serverv  ( Win2003 , SP 與 線上更新都ok ,安裝 SQL2000+SP4, IP=192.168.100.11)

    兩台電腦各自獨立,未加入網域,管理者密碼也不相同。

     

    狀況1. Web Server 中 網站透過 odbc 以 192.168.100.11,1433 連接資料庫

    Global.asa 中設定連線資訊:

    Application("conNET_ConnectionString") ="APC"

    Application("conNET_ConnectionTimeout") = 15

    Application("conNET_CommandTimeout") = 30

    Application("conNET_CursorLocation") = 3

    Application("conNET_RuntimeUserName") = "apcuser"

    Application("conNET_RuntimePassword") = "d7hh2ks6615c"

     

    ASP網頁中連結語法為:(ins_APC001Status.asp)

    dim conNET

    Set conNET = Server.CreateObject("ADODB.Connection")

    conNET.Open Application("conNET_ConnectionString") ,Application("conNET_RuntimeUserName") ,Application("conNET_RuntimePassword")

    - - - - - -

    strSQL="Select * from W_APC001_Status Where AID=" & AidNo

    Set rs=Server.CreateObject("ADODB.Recordset")

    rs.Open strSQL,conNET

    if rs.eof then

    - - - - - -

    else

    - - - - - -

    end if

     

    set rs=nothing

    set conNET=nothing

     

    再一個網頁(Main.asp)中崁入數個 Iframe 去呼叫上述 ins_APC001Status.asp 網頁,取得並顯示狀態內容。(一般大約會同時開啟15-30個IFrame)

    所以在顯示 Main.asp 這個網頁時,一開始是正常的,但是要是同時有較多同事一起開啟 Main.asp 這個網頁時,就會發生以下的錯誤訊息......

     

    Microsoft OLE DB Provider for SQL Server 錯誤 '80004005'

    [DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒絕存取。

    /Util/ins_APC001Status.asp , 列25

     

    一開始以為是 odbc 的問題,所以重裝兩台系統後,將資料連線的方式改為:(Global.asa )

    Application("conNET_ConnectionString") = "Provider=SQLOLEDB;Data Source=192.168.100.11,1433;Initial Catalog=APC;User ID=apcuser;Password=d7hh2ks6615c"

     

    其他 asp 中的語法都同上例,未作修改。

     

    結果一開始也是正常可以開啟網頁看到監測內容,但是過一段時間後,網頁更新速度開始變慢,最後又出現同樣的錯誤訊息。

     

    我必須強調,IIS 與 SQL 都是在內部網路工作,對外是完全不通的,也只有幾台工作站分散在不同辦公室中開啟 web 中的監控網頁。

    為了排除病毒與攻擊的問題,所有電腦也都重新安裝過並作過線上更新(線上更新完後防火牆與外部網路完全撤除,全都不能上網)

     

    原本在 win2000 環境下並未發生這樣的現象,最近升級到 win2003 之後,這個問題就出現了。

    原本以為是 odbc 的問題,但是改為 OLEDB 方式連線後,一樣出現這樣的狀況。

     

    後來開啟 dos 視窗檢查 web 主機上資料連線數量發現,只要  Main.asp 這個網頁刷新一次,再dos視窗用 netstat -n 檢查,就發現會出現許多

      TCP    192.168.100.10:2310    192.168.100.11:1433   TIME_WAIT

      TCP    192.168.100.10:2311    192.168.100.11:1433   TIME_WAIT

      TCP    192.168.100.10:2312    192.168.100.11:1433   TIME_WAIT 

      ..........(192.168.100.10 Port 號會一直增加,但 192.168.100.10 明顯是 web 自己的 IP,並非其他電腦的ip)

     

    並且一直累增,直到數千個時,Main.asp 網頁刷新就開始變慢,最後出現上述錯誤訊息。

    同時我用效能監視器監看 SQL 主機的資料連線數量,卻只有6-18個左右(視 User 數量不定)。

     

    我後來試過將 WEB 升級為主控站,ODBC 原本是Call IP的方式改為 Call Name的方式,

    就完全恢復正常??? 真的是太奇怪了,究竟是什麼原因呢?

    由於這套系統在內部測試功能正常之後,就要開放給外部使用,

    如果  web 本身是主控站,實在太不安全了。

     

    (有試過另外建立主控站,但是ODBC設定時可以用 name 的方式呼叫,但是網頁開啟時就會出現

    Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005'

    [Microsoft][ODBC SQL Server Driver][Named Pipes]SQL Server 不存在或拒絕存取。

    /Util/ins_APC001Status.asp , 列25
     

    改用 OLEDB 或是 odbc by IP 方式呼叫就會有上述一開始正常最後還是會錯誤的現象 )

     

    請教各位前輩指點,這究竟是什麼原因?

    是我的資料連線語法與開啟 RecordSet 方式不對,或是系統在安裝時有其他授權或權限的設定需要調整?

    或是 Window 2003 的 odbc 與 oledb 的問題?

     

    2007年7月11日 下午 07:15
  • 請問 這跟 Window 2003 中 MSDTC ,預設的安裝選項並不支援跨機器的分散式交易 有關嗎?
    2007年7月11日 下午 07:38
  • 以下內容由 這樣表示SQL server被入侵的嗎?  轉貼而來:
     

    Dear Alex

     

    我的問題倒不是在 [ 無法連結資料庫 ] 這部分,而是在網頁開啟或刷新後,似乎有許多 DataConnect 被鎖住

    因為不管是用 OLEDB 或是 用 ODBC ,一開始都可以正常連結資料庫開啟網頁。

    但是一段時間之後,用 netstat -n 查看,會有數百上千個

     

      TCP    192.168.100.10:2310    192.168.100.11:1433   TIME_WAIT

      TCP    192.168.100.10:2311    192.168.100.11:1433   TIME_WAIT

      TCP    192.168.100.10:2312    192.168.100.11:1433   TIME_WAIT 

      .................................. 

     

      TCP    192.168.100.10:4931    192.168.100.11:1433   TIME_WAIT

      TCP    192.168.100.10:4932    192.168.100.11:1433   TIME_WAIT 

      .................................. 

     

    累積再 web 這台主機中,我想最後會造成這樣錯誤訊息

    Microsoft OLE DB Provider for SQL Server 錯誤 '80004005'

    [DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒絕存取。

    /Util/ins_APC001Status.asp , 列25

    有可能如同你說的SQL當掉,但是我在 SQL 主機上並未查到任何異狀,也確認 SQL Server 當時是正常的。

    如果有異常,應該是 Web Connect to SQL 這個中間或兩端的問題。

    而在三測試,似乎問題是出在 web 端。

     

    我想請教的是:

    為何在 WEB 端會有大量的 Connect 一直累積沒有被重複使用或是釋放 ? 該如何解決 ?

     

     

     




    mark20031206

    2007年7月12日 下午 03:51
    版主
  • Sorry ,實在是心急如焚,所以重複發問了。

     

     

    2007年7月12日 下午 03:55
  • 這與您程式的寫法有關係,由於沒看到您的程式碼,不知道您於使用 ASP 存取資料庫之後,是否有在適當的時機關閉資料庫的連線?當您的程式沒有釋放資料庫連線,那麼資料庫勢必要開啟新的連線,以供您的程式存取。您可以朝向這個方向去檢查您的程式碼,是否有關閉資料庫連線。

    提醒您!若要貼程式碼,請移駕 MSDN 的 資料庫與程式開發(SQL Server Development) 
    討論區。會有這樣的兩區是因為討論區的取向不同。
    2007年7月12日 下午 03:56
    版主
  • 前面有簡略列出我的程式碼

     

    ASP網頁中連結語法為:(ins_APC001Status.asp)

    <%

    dim conNET

    Set conNET = Server.CreateObject("ADODB.Connection")

    conNET.Open Application("conNET_ConnectionString") ,Application("conNET_RuntimeUserName") ,Application("conNET_RuntimePassword")

    %>

      ( html code 略)- - - - - -

    <%

    strSQL="Select * from W_APC001_Status Where AID=" & AidNo

    Set rs=Server.CreateObject("ADODB.Recordset")

    rs.Open strSQL,conNET

    if rs.eof then

       (略)- - - - - -

    else

       (略)- - - - - -

    end if

     

    set rs=nothing

    set conNET=nothing

    %>

     

     

    Global.asa 中設定連線資訊:

    模式一:Web Server 主機 設定 odbc 以 192.168.100.11,1433 連接資料庫

     

    Application("conNET_ConnectionString") ="APC"

    Application("conNET_ConnectionTimeout") = 15

    Application("conNET_CommandTimeout") = 30

    Application("conNET_CursorLocation") = 3

    Application("conNET_RuntimeUserName") = "apcuser"

    Application("conNET_RuntimePassword") = "d7hh2ks6615c

     

    模式二:改用 OLEDB

    Application("conNET_ConnectionString") = "Provider=SQLOLEDB;Data Source=192.168.100.11,1433;Initial Catalog=APC;User ID=apcuser;Password=d7hh2ks6615c"

    Application("conNET_ConnectionTimeout") = 15

    Application("conNET_CommandTimeout") = 30

    Application("conNET_CursorLocation") = 3

    Application("conNET_RuntimeUserName") = "apcuser"

    Application("conNET_RuntimePassword") = "d7hh2ks6615c

     

    大致是這樣,我也有試著將 Network Library=DBMSSOCN 加入到語法中指定,或是用 Data Source=tcp:192.168.100.11,1433 方式連結資料庫,

    但是一樣會累積一大堆的 Connect ,一直累積到最後造成錯誤。

     

     

    2007年7月12日 下午 04:06
  •  mark20031206 寫信:
    請問 這跟 Window 2003 中 MSDTC ,預設的安裝選項並不支援跨機器的分散式交易 有關嗎?
    MSDTC 是用來協調分散式環境的交易並管理相關資源的一個系統服務。由於分散式環境的訊息、資料庫、檔案系統大多以交易的方式進行傳遞,便會使用 MSDTC 進行交易時的協調工作。Windows Server 2003 x86 預設是自動啟用這個服務的。因此與這個服務無關!
    2007年7月12日 下午 04:07
    版主
  •  mark20031206 寫信:
    <%

       (略)- - - - - -

     

    set rs=nothing

    set conNET=nothing

    %>

    我都會先呼叫 close 的方法,然後才設定成 nothing:
    Code Snippet
    rs.close
    conNET.close
    set rs=nothing
    set conNET=nothing

     


    註:ASP 對我來說已經是七八年前的東西了....
    2007年7月12日 下午 04:20
    版主
  • 是的, Close 是不敢忽略,最後才是 Nothing

    照理這樣應該會釋放掉連線,所以才百思不解

    為何會被鎖住或佔用,下次網頁刷新時他又再開一個新的連線.....

    就這樣一直累積.....

     

    2007年7月12日 下午 04:31