台灣最大程式設計社群網站
線上人數
1147
 
會員總數:243277
討論主題:188067
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 共用集區最大值以及dispose()
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
共用集區最大值以及dispose()
價值 : 30 QP  點閱數:215 回應數:13

樓主

LuLu
門外漢
0 10
251 25
發送站內信

最近有遇到共用集區最大值的問題,看了一些文章說要注意reader.close()或是conn.close()
但是我每次寫程式都有注意要close()
後來又看到要加dispose()
但是有些人又說每個都加dispose()效果不大,因為conn Close()掉後,就會自己放進ConnectionPool裡,每次跟資料庫溝通就建一次,然後Dispose掉,反而會更浪費資源
所以到底使用dispose()的時機是什麼?
reader.dispose()
cmd.dispose()
conn.dispose()
Dispose()
這些到底有什麼不同,用哪個好?
最根本的問題就是共用集區最大值這個問題除了改動iis設定之外,到底要怎麼解決?






搜尋相關Tags的文章: [ 共用集區 ] , [ dispose ] ,
本篇文章發表於2018-09-27 11:13
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
最有價值解答

topcat
捐贈 VP 給 topcat 檢舉此回應
1.Dispose並不是立刻進行回收,而是登記可回收
2.Connection Pool有一些先決條件,例如:連接字串是一樣的
詳細請參考

https://docs.microsoft.com/zh-tw/dotnet/framework/data/adonet/sql-server-connection-pooling

3.比較建議的是,用完盡快放
有些人喜歡把Connection放到Session中佔住不放,個人覺得這不是好的設計(Windows Form的習慣)
用完立刻釋放,才能有機會回到Connection Pool等待下一個呼叫時從Connection Pool取用

4.建議使用Using宣告Connection,這是避免用了忘記或者缺漏關閉回收的方式
用Using宣告Connection變數,在End Using的時候會自動關閉並宣告可回收

最後,小喵之前寫的一篇文章分享
物件Object的New,Dispose與Connection的Open,Close概念分享

^_^
本篇文章回覆於2018-09-27 11:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

LuLu
檢舉此回應
我現在不知道為何頻繁遇到共用池到最大連結數這個問題,每次conn都有close,所以是推薦我要dispose嗎
本篇文章回覆於2018-09-27 14:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
我現在不知道為何頻繁遇到共用池到最大連結數這個問題,每次conn都有close,所以是推薦我要dispose嗎


重要的東西要講三次

小喵的建議:

用Using宣告Connection變數∼
用Using宣告Connection變數∼
用Using宣告Connection變數∼

其實小喵#1的第4點就有特別強調
範例在貼出來的微軟官方連結裡面也有

您再看仔細些
^_^
本篇文章回覆於2018-09-27 14:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

LuLu
檢舉此回應
已改用Using宣告Connection變數,但似乎還是會遇到同樣的問題...
除了這部分可能造成還有別的原因嗎?
設定pooling=false和Connection Lifetime=10會不會比較好?
本篇文章回覆於2018-09-27 19:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
不知道您改了幾處?
如果要改,必須全面一起改唷

另外,這一篇參考看看
https://dotblogs.azurewebsites.net/rainmaker/2017/04/26/143316

^.^a
本篇文章回覆於2018-09-27 23:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

LuLu
檢舉此回應
好的感謝大大,最後想再問清楚就結帖了,設置pooling=false到底Connection Lifetime=10到底對共用池有沒有幫助?
有人說把pooling關掉就沒有那個問題,但有副作用,Connection Lifetime要設多少也不明確,這兩個到底作用是?
本篇文章回覆於2018-09-27 23:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
設置pooling=false


把Pooling關掉,代表者每次要開啟連結,都要建立新的連結,建立連結這個過程,是非常耗資源的
也因此,才會有Connection Pooling的機制,讓建立起來的連結,可以重複使用

Connection Lifetime=10

這是設定在Connection被放回Pooling之後,存活的時間,單位是秒
因此把時間設的這麼短,一樣可能造成『幾乎』每次都重新建立連結(耗資源)

小喵覺得
把全部的程式碼都翻出來,使用Connection的過程、時間盡量縮短
所有程式用完立馬放回Pooling,不要佔住不放
以上,只要把所有的程式宣告Connection都用Using來宣告
相信會有幫助
如果之前的人有寫使用Connection後,還把他存在Session之類的,以為是重複使用
卻造成佔住不放的問題,如果有人這樣寫,那麼相關程式建議務必修正

工程雖然會很浩大,但是,總是把事情作對,往對的方向去走,會比用奇怪的方式補牆,卻造成補東壞西來得好

以上是小喵的建議,提供參考

^_^
本篇文章回覆於2018-09-28 00:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

LuLu
檢舉此回應
也就是說pooling=false和Connection Lifetime=10不但沒有幫助,反而容易造成共用區到達最大值的情況囉?
我這邊的程式使用Connection都沒有放在Session,但是最後面必定加上close()
之前一段時間都沒有問題,但最近幾天突然頻繁發生共用區到達最大值,甚至有過20分鐘內發生好幾次
雖然沒有用using但是感覺close()都有齊,所以現在擔心會不會用了using以後結果沒改善
目前已改了一半using,還不知道結果
本篇文章回覆於2018-09-28 01:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
也就是說pooling=false和Connection Lifetime=10不但沒有幫助,反而容易造成共用區到達最大值的情況囉?


不是這樣
嗯∼
換幾個名詞講

當廁所(Connection Pool)容易塞住
於是就把廁所拆了(Pooling=false),或者,只要10秒沒人用就把廁所封起來(Connection Lifetime=10)
導致每次要上廁所,要碼沒廁所要跑好遠
不然就是花很大的功夫把封閉的廁所重新拆封打掃才能用

其實,只要每次都用正確的方式,投入的只有衛生紙,
不會投入不該投的面紙
就不會塞住
真的不必把廁所拆了,也不必把廁所封了

這樣子的描述,不知道樓主是否比較容易理解

^.^a
本篇文章回覆於2018-09-28 22:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

LuLu
檢舉此回應
topcat大大,我把連線全部換成using了,但是還是會有共用集區到最大值這個問題
這跟
<add name="ConnectionString1" connectionString="data source....
<add name="ConnectionString2" connectionString=".......
80%都用ConnectionString1只有20%使用ConnectionString2有關係嗎?還是使用者一直停留在同一個畫面太久using也沒用?
本篇文章回覆於2018-09-30 21:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

LuLu
檢舉此回應
按照top cat大大比喻,多花一番功夫但是可以改善共用集區嗎?
如果實在不行使用pooling=false和Connection Lifetime=10會有幫助嗎?
一直搞不懂為什麼會遇到共用集區到最大值這個問題
本篇文章回覆於2018-09-30 21:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
<add name="ConnectionString1" connectionString="data source....
<add name="ConnectionString2" connectionString=".......
80%都用ConnectionString1只有20%使用ConnectionString2有關係嗎?


這樣會有兩個Connection Pool

建議您參考以下這個,去觀察一下您的系統的Connection Pool
https://dotblogs.com.tw/joysdw12/2011/08/16/33279


還是使用者一直停留在同一個畫面太久using也沒用?


ASP.NET的運作是
1.IIS編譯執行Server端的aspx與CodeFile(aspx.vb or aspx.cs)
2.產出Html+JavaScript+CSS的內容,Response送出給Client端的瀏覽器
3.瀏覽器讀取2.的Html+Javascript+CSS,產生畫面

基本上,1.執行完,2.送出
接下來跟Server就沒關係,都是Client端
所以使用者停留多久,都與Server端沒關係
直到下次Request向Server端,再次運作1,2,3

除非,你的系統不斷的Reflash,或者,不斷向Server Request

我手上沒有程式碼,不知道您的程式碼改怎麼樣,是否改對
有沒有全部都處理了?有沒有批次不斷的跟Server要求

小喵只能提供您方向,剩下的您要依據自己系統的情況去調整

如果實在不行使用pooling=false和Connection Lifetime=10會有幫助嗎?

如果您要一個簡單的回答,不去深入理解
小喵會說:這樣只會更糟∼
為什麼更糟,回去上面再仔細看∼

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

LuLu
檢舉此回應
好了,謝謝小喵,這樣我差不多都了解了,結帖了
本篇文章回覆於2018-10-02 15:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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