最佳解答者
static connection 不能close?

問題
-
外面乎叫了一次Db2 , open 了就有一個spid, 但明明按了button 去close connection, 但
sys.sysprocesses 裏的spid 卻沒有消失, 是不是static 作怪?
public class Db { static string _connectionString = ConfigurationManager.ConnectionStrings["FoodConnectionString"].ConnectionString; public static SqlConnection connection; public static string Db2() { connection = new SqlConnection(_connectionString); connection.Open(); string spid = ""; SqlCommand command = connection.CreateCommand(); command.CommandText = "SELECT spid,loginame as LoginName FROM sys.sysprocesses WHERE dbid > 0 and loginame like 'sa'"; using (SqlDataReader datareader = command.ExecuteReader()) { if (datareader.HasRows == true) { while (datareader.Read()) { spid = datareader["spid"].ToString()+","; } } datareader.Close(); } return spid; }
心癮又會想偷一個敏
解答
-
太感動, 原來是clearpool , 終於成為完全體了
protected void LogOutButton_Click(object sender, EventArgs e) { //UtilTools.Db.Execute("Kill " + UtilTools.Db.spid); UtilTools.Db.connection.Close(); SqlConnection.ClearPool(UtilTools.Db.connection); UtilTools.Db.connection.Dispose(); }
心癮又會想偷一個敏
- 已標示為解答 沈世鈞 2012年3月14日 上午 08:26
所有回覆
-
另有一個button 是按了就關, 但SQL management studio 看到number of connection 沒有少,
有時重run 也沒有用新的spid 反而用舊的, 且logout button click 也沒有remove spid
protected void LogOutButton_Click(object sender, EventArgs e) { UtilTools.Db.connection.Close(); UtilTools.Db.connection.Dispose(); }
心癮又會想偷一個敏
- 已編輯 沈世鈞 2012年3月14日 上午 07:39
-
你用Button A去Create Connection
然後想用Button B去Close Connection ???
建議您先熟悉一下Web運作原理吧
軟體開發領域裡區區一個迷途工程師
MyBlog: http://www.dotblogs.com.tw/ian/
開發ASP.NET您要瞭解的基楚- 已提議為解答 MIS2000 Lab. _ 2012年3月15日 上午 01:17
-
sys.sysprocesses (Transact-SQL)
你的認知是,Conn.Close 一執行,spid 要"立刻" 不見,是嗎?
blog.kkbruce.net
Plurk
Google+專頁
春有百花秋有月,
夏有涼風冬有雪,
若無閒事在心頭,
便是人間好時節。 -
剛試了, 情況一樣, 仍沒有remove spid
protected void LoginButton_Click(object sender, EventArgs e) { UtilTools.Db.connection = new SqlConnection(UtilTools.Db._connectionString); UtilTools.Db.connection.Open(); } protected void LogOutButton_Click(object sender, EventArgs e) { UtilTools.Db.connection.Close(); UtilTools.Db.connection.Dispose(); }
心癮又會想偷一個敏
-
重點是最後一句啦:「建議您先熟悉一下Web運作原理吧」
你試了沒?
blog.kkbruce.net
Plurk
Google+專頁
春有百花秋有月,
夏有涼風冬有雪,
若無閒事在心頭,
便是人間好時節。- 已提議為解答 MIS2000 Lab. _ 2012年3月15日 上午 01:17
-
太感動, 原來是clearpool , 終於成為完全體了
protected void LogOutButton_Click(object sender, EventArgs e) { //UtilTools.Db.Execute("Kill " + UtilTools.Db.spid); UtilTools.Db.connection.Close(); SqlConnection.ClearPool(UtilTools.Db.connection); UtilTools.Db.connection.Dispose(); }
心癮又會想偷一個敏
- 已標示為解答 沈世鈞 2012年3月14日 上午 08:26
-
我猜你如果佈署到server上,有超過一個人在進行測試。
再來就是要發問,為什麼發生connection尚未關閉,無法建立連線的錯誤。
然後其實在好幾篇前的發問,就跟你說明了不能這樣做。
你還是執意一個人開發跟測試做的很爽...除非你是寫只有一個人使用且單一連線的系統。(那似乎就不需要用web了...)
by the way, 你確定你知道connection pool是在幹嘛的嗎?清掉,下次就不要又發問說為什麼建立連線要花這麼多的時間...
一切的問題,都不是在技術上,而是在你自己學習和實作的心態問題。
若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。
請參考:SQL injection簡介與解決方式
常用資源參考:
小弟的blog: In 91,wiki: my wiki- 已提議為解答 MIS2000 Lab. _ 2012年3月15日 上午 01:17
-
不要看到"黑影就開槍",
請了解什麼是 connection pool,亂關一樣,你也幫幫忙!
不然先註明,那段程式碼是你自己寫的,不是版上或msdn是教的。
blog.kkbruce.net
Plurk
Google+專頁
春有百花秋有月,
夏有涼風冬有雪,
若無閒事在心頭,
便是人間好時節。- 已提議為解答 MIS2000 Lab. _ 2012年3月15日 上午 01:17
-
自作聰明的寫法, 還標示自己為解答, 你自己喜歡自作聰明亂寫就算了, 不要害到以後看到這篇文的人, 還真的以為那是正確的解決方法.
- 已提議為解答 MIS2000 Lab. _ 2012年3月15日 上午 01:18
-
但我看過post, 每個user 都會有一份copy, 又怎會共用一條connection?!
心癮又會想偷一個敏
你如果放在靜態成員裡面,當然就是同一份。
還是你也不懂static的意義?
若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。
請參考:SQL injection簡介與解決方式
常用資源參考:
小弟的blog: In 91,wiki: my wiki -
91哥, 他開心就好了, 子曰: 糞土之牆不可杇也. 多說無益.
- 已提議為解答 MIS2000 Lab. _ 2012年3月15日 上午 01:18
-
太感動, 原來是clearpool , 終於成為完全體了
protected void LogOutButton_Click(object sender, EventArgs e) { //UtilTools.Db.Execute("Kill " + UtilTools.Db.spid); UtilTools.Db.connection.Close(); SqlConnection.ClearPool(UtilTools.Db.connection); UtilTools.Db.connection.Dispose(); }
您真的知道您在做啥嗎?
清掉Connection Pool做啥?
建立Connection是一件辛苦又費功的一件事情
Connection Pool可以讓Connection在沒人用後,下一個要使用時可以快速地使用,不必重新建立連線
結果您把他清掉了
另外,一些觀念與您分享
物件Object的New,Dispose與Connection的Open,Close概念分享
topcat(姍舞之間的極度凝聚)http://www.dotblogs.com.tw/topcat/
- 已提議為解答 MIS2000 Lab. _ 2012年3月15日 上午 01:18
-
如果您要宣告Static,建議是把Connection String宣告在Static而不是Connection
Connection的使用要越短越好,最好是能夠確保使用後能夠馬上釋放出去,讓他在Connection Pool
裡面等待下一個人使用。
所以建議是使用Using去宣告Connection,讓他在End Using的時候可以自動的Close並且Dispose
^_^
topcat(姍舞之間的極度凝聚)http://www.dotblogs.com.tw/topcat/
小喵,沒用的,這我在他前幾天的發問已經說過了。聽不進去,神仙難救無命客。
請看
- http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/67f7ad96-cda3-43b8-b16d-267b127ee758#16c737cd-7875-4999-bfd3-525529e5db41
- http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/484f38f9-4931-45a0-95a9-82a533b4b3d4
早就說過了...最後還是一樣。
而且問題是在『同一份』,而不只是static,他上面講『share non-static Sqlconnection』就可以解決這問題,就代表他根本沒搞懂,什麼叫做同一份。既然是『share』,不就是指同一份....
我也不知道是我講的不清楚,還是他聽不懂,還是他懂了還硬要這樣幹....不想浪費時間了。
若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。
請參考:SQL injection簡介與解決方式
常用資源參考:
小弟的blog: In 91,wiki: my wiki -
另有一個button 是按了就關, 但SQL management studio 看到number of connection 沒有少,
有時重run 也沒有用新的spid 反而用舊的, 且logout button click 也沒有remove spid
protected void LogOutButton_Click(object sender, EventArgs e) { UtilTools.Db.connection.Close(); UtilTools.Db.connection.Dispose(); }
心癮又會想偷一個敏
也就是說,當你的「網頁程式」連上DB的時候
必須要手動按下這個按鈕,才會關閉資料庫的連結????
看起來,您連 PostBack(回傳)的觀念都沒有,卻已經能寫 ADO.NET程式了
小弟萬分佩服啊我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/
-
太感動, 原來是clearpool , 終於成為完全體了
protected void LogOutButton_Click(object sender, EventArgs e) { //UtilTools.Db.Execute("Kill " + UtilTools.Db.spid); UtilTools.Db.connection.Close(); SqlConnection.ClearPool(UtilTools.Db.connection); UtilTools.Db.connection.Dispose(); }
您真的知道您在做啥嗎?
清掉Connection Pool做啥?
建立Connection是一件辛苦又費功的一件事情
Connection Pool可以讓Connection在沒人用後,下一個要使用時可以快速地使用,不必重新建立連線
結果您把他清掉了
另外,一些觀念與您分享
物件Object的New,Dispose與Connection的Open,Close概念分享
topcat(姍舞之間的極度凝聚)http://www.dotblogs.com.tw/topcat/
[讀書心得]SQL Server 連接共用--集區的建立及指派
原文出處:http://msdn.microsoft.com/zh-tw/library/8xx3tyca.aspx
http://www.dotblogs.com.tw/mis2000lab/archive/2011/04/07/connection_pool_20110407.aspx
SQL Server 連接共用 (ADO.NET)
SQL Server Connection Pooling (ADO.NET)我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/
-
另有一個button 是按了就關, 但SQL management studio 看到number of connection 沒有少,
有時重run 也沒有用新的spid 反而用舊的, 且logout button click 也沒有remove spid
protected void LogOutButton_Click(object sender, EventArgs e) { UtilTools.Db.connection.Close(); UtilTools.Db.connection.Dispose(); }
心癮又會想偷一個敏
當您執行這個網頁的 "當下"、在您還「來不及」按下 Button按鈕去關閉DB連結 的 "時候"
這一次,網頁程式的生命週期,已經結束了
您沒有這樣的觀念的話,「砍掉重練」吧!以下引述我的文章( [給初學者的話]不要練功練了三年,才發現自己必須「砍掉重練」!)--
http://www.dotblogs.com.tw/mis2000lab/archive/2012/03/15/game_over.aspx
因為 ASP.NET網頁的特性與生命週期
跟其他 ASP / PHP / JSP都不太一樣
他強調「PostBack(回傳)」簡單地說,
(1). 您在畫面(網頁)上的任何動作,例如:按下按鈕,或是按下(操作)什麼控制項的功能......
都會觸發「PostBack(回傳)」
然後重新執行一次Page_Load事件......
(2). 我也必須在第一節課裡面,讓學生知道「網頁程式」是一個無狀態的協定(Stateless Protocol)
所以有了這個範例:
[補充]上集, Ch.2 入門與觀念的練習 for Beginner (按鈕之後,數值加一,累加)
http://www.dotblogs.com.tw/mis2000lab/archive/2011/10/26/ch2_beginner_page_load_2011.aspx
您可能覺得這例子很蠢
因為這是一個道具,必須要搭配魔術師,才能創造一場精彩的「秀」。
我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/
- 已編輯 MIS2000 Lab. _ 2012年3月15日 上午 02:16
-
重點不是「你程式有錯!」
你是「觀念」有錯!
錯誤一:
網頁程式執行完畢,User的瀏覽器收到成果
(User的瀏覽器,底下有個光棒,他跑完後,就代表 User與 Web Server兩者都無關了,都斷了聯繫)依照您的寫法,(程式裡面)資料庫的連線根本不會中斷
這樣的錯誤,別說是網頁程式,即使是在 Windows程式內都很令人詫異啊!
既然您要寫 ADO.NET程式,
那麼你瞭解 DataReader / DataSet兩者的差異嗎?
沒搞清楚以前,不要拼命寫一堆「觀念有錯」的Code
錯誤二:
寫在 Button_click事件內的 Connection.Close()
當你按下以後,會重新 PostBack
這個觀念你懂了沒?一個不小心,可能在您按下 Button的時候
不但沒有關閉上一次的DB連線?
還會多跑一次DB連線、然後關閉。
又多浪費資源一次我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/
-
我的媽!
大哥您就是以前那位名人,想寫書的那個啊
http://social.msdn.microsoft.com/Forums/zh-TW/800/thread/fb1827a1-ec2f-46e4-b294-b40abc14ef7b
失敬!失敬!
您應該是「MSDN論壇的小婷」了,當之無愧http://itgroup.blueshop.com.tw/inmarkblue/markshu?n=convew&i=303843
我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/