台灣最大程式設計社群網站
線上人數
656
 
會員總數:242479
討論主題:187514
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 請問DotNet 連線 SQL Connection數的計算方式
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
請問DotNet 連線 SQL Connection數的計算方式
價值 : 50 QP  點閱數:312 回應數:10

樓主

芋頭
初學者
247 444
2916 437
發送站內信

各位大大
我遇到連線數過多的問題

<add name="XXXX" connectionString="Data Source=XXX.XXX.XXX.XXX;Initial Catalog=XXXX;User ID=AP;Password=AP;Application Name=XXXXX;Max Pool Size=300" providerName="System.Data.SqlClient"/>

我檢查了程式 開關connection 目前都已經放在try catch finally裡面,但是connection數還是居高不下(一整天大約50~70人使用此系統),

請問一隻程式之中,一個命令就算一個connection對嗎?

例如一個page有10個select command(page上上下下有不同的select command)
有10個Insert command,有10個 update Command
那麼如果A每個動作都執行過一次那麼就是有30個conection 對嗎?

此時B也使用此系統,除非是其他功能不然舊會沿用此30個connection 這樣裡解正確嗎?

但實際上有時候卻有超過300個連線數,請問還有哪邊忽略了
謝謝

搜尋相關Tags的文章: [ 連線數過多 ] ,
本篇文章發表於2018-01-23 17:58
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
最有價值解答

topcat
捐贈 VP 給 topcat 檢舉此回應
建議:
1.宣告Connection的時候,使用Using宣告
那麼,在End Using的時候,會自動的釋放

2.
>>請問一隻程式之中,一個命令就算一個connection對嗎?
不是唷
看你的程式怎麼寫,以及當下運作的情況,會有不同的可能性唷



小喵的認知,上述的寫法,在單一使用者用Web運作時是同一個Connection
如果有10個使用者,同時運作相同頁面,跑相同這程式,就會有10個Connection

如果

上述的寫法,在單一使用者透過Web執行程式時
假設他們的ConnectionString都是相同
那麼,可能的連線數是1~3個
為何可能一個,是因為還有Connection Pool機制
1個用完,回收(到Pool中),第二個剛好Connection Pool中有空著的,就接著用
由於您沒有貼出來您的程式碼,無法知道是否有正確回收

蠻大的可能,可能是您沒有做到正確的回收
Conn.Close()不代表回收唷
應該還要
Conn.Dispose()

您的Try Catch Finally怎麼寫呢?

---
用Using宣告Connection,在End Using的時候,會自動的Close與Dispose
所以,小喵建議您,改用Using來宣告Connection

---
Connection Pool機制也可以減少開啟Connection
這機制建議您搜尋關鍵字,進行瞭解一下

^_^




本篇文章回覆於2018-01-23 19:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

MIS2000 Lab
檢舉此回應
(1) 您有關閉連線嗎?
例如 Conn.Close() 註:Conn就是 SqlConnection

另外,您得使用 using...才有辦法關閉
try...catch..finally... 不會自動關閉連線

參考一下 https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/using-statement
" using 陳述式可確保呼叫 Dispose,即使在您呼叫物件上的方法時發生例外狀況也一樣。 "



(2) Q : 請問一隻程式之中,一個命令就算一個connection對嗎?

A : 應該說,一個連線(Conn,同上)裡面,可以有多個命令被執行
例如 https://docs.microsoft.com/zh-tw/dotnet/framework/data/adonet/sql/enabling-multiple-active-result-sets
或是找一下 DataReader的 .NextResult()方法

微軟的文件都有中文化,稍微看一下吧
或是找本 ADO.NET的書看看

本篇文章回覆於2018-01-23 19:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

MIS2000 Lab
檢舉此回應
分享:

以前我都會在 Conn.Close()後面
手動補上 Conn.Dispose()

VS2017裡面有一個功能,可以針對程式碼最佳化(抱歉,我忘記他的名字了。好像叫做「程式碼分析」)
這個版本卻把程式裡面所有 .Dispose()的方法都標示出來
說這樣不好.....(他有解釋為什麼,但我現在忘了,各位可以試試看)

後來我就不再自己動手寫 Conn.Dispose()
本篇文章回覆於2018-01-23 19:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

小魚
檢舉此回應
微軟是會自己處理掉,
但問題是我不知道它何時處理掉...
這不知道要怎麼Check?

我可以每天倒垃圾,
也可以一個月倒一次垃圾,
我也可以說我都有倒垃圾啊...
@@
本篇文章回覆於2018-01-23 19:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

芋頭
檢舉此回應
我的語法類似下方
我並沒有下Dispose 因為我記得之前在哪裡看過有文章寫如果Dispose後,下次又要花費多的效能來建立
再請大家指導一下
謝謝~~

SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["test"].ToString());
SqlCommand cmd = cn.CreateCommand();
SqlDataReader rd = null;
string strSQL = "";

try
{
cn.Open();
//開始做事
}
catch { }
finally {
try
{
if (rd.IsClosed == false)
{ rd.Close(); }
}
catch { }

if (cn.State == ConnectionState.Open)
{
cn.Close();
}
}
本篇文章回覆於2018-01-24 09:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

MIS2000 Lab
檢舉此回應
topcat大大說的「Connection Pool機制也可以減少開啟Connection」

不知道這兩篇文章能否幫上忙?僅供參考

SQL Server 連接共用--集區的建立及指派 #1
http://mis2000lab.pixnet.net/blog/post/34976479

SQL Server 連接共用--集區的建立及指派#2 -- ClientConnectionId屬性 (.NET 4.5起)
http://mis2000lab.pixnet.net/blog/post/34976485
本篇文章回覆於2018-01-24 10:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

小魚
檢舉此回應
如果要判斷關閉,最好是用 State != ConnectionState.Closed
本篇文章回覆於2018-01-24 12:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
建議用using
改成這樣

using結束會自動回收,不必特意再去close與dispose

^_^

本篇文章回覆於2018-01-24 13:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

芋頭
檢舉此回應
所以大家還是建議 使用dispose嗎??
本篇文章回覆於2018-01-31 15:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
建議用Using 宣告 Connection
(這是第三次∼)

^.^a
本篇文章回覆於2018-01-31 17:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.