none
static connection 不能close? RRS feed

  • 問題

  • 外面乎叫了一次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;
            }


    心癮又會想偷一個敏

    2012年3月14日 上午 07:25

解答

所有回覆

  • 你哪裡有關 connection?

    你只關了 DataReader。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure

    2012年3月14日 上午 07:36
    版主
  • 語不清,意不明!@_@

    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年3月14日 上午 07:36
  • 另有一個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
    2012年3月14日 上午 07:38
  • 你用Button A去Create Connection 

    然後想用Button B去Close Connection ???

    建議您先熟悉一下Web運作原理吧


    軟體開發領域裡區區一個迷途工程師
    MyBlog: http://www.dotblogs.com.tw/ian/
    開發ASP.NET您要瞭解的基楚

    2012年3月14日 上午 07:47
    版主
  • sys.sysprocesses (Transact-SQL) 

    你的認知是,Conn.Close 一執行,spid 要"立刻" 不見,是嗎?


    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年3月14日 上午 07:49
  •  剛試了, 情況一樣, 仍沒有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();
        }


    心癮又會想偷一個敏

    2012年3月14日 上午 07:52
  • 重點是最後一句啦:「建議您先熟悉一下Web運作原理吧」 

    你試了沒?


    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年3月14日 上午 07:56
    • 已標示為解答 沈世鈞 2012年3月14日 上午 08:26
    2012年3月14日 上午 07:58
    版主
  • 太感動, 原來是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
    2012年3月14日 上午 08:25
  • 我猜你如果佈署到server上,有超過一個人在進行測試。

    再來就是要發問,為什麼發生connection尚未關閉,無法建立連線的錯誤。

    然後其實在好幾篇前的發問,就跟你說明了不能這樣做。

    你還是執意一個人開發跟測試做的很爽...除非你是寫只有一個人使用且單一連線的系統。(那似乎就不需要用web了...)

    by the way,  你確定你知道connection pool是在幹嘛的嗎?清掉,下次就不要又發問說為什麼建立連線要花這麼多的時間...

    一切的問題,都不是在技術上,而是在你自己學習和實作的心態問題。


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:


    小弟的blog: In 91,wiki: my wiki

    2012年3月14日 上午 08:47
    版主
  • 不要看到"黑影就開槍",

    請了解什麼是 connection pool,亂關一樣,你也幫幫忙! 

    不然先註明,那段程式碼是你自己寫的,不是版上或msdn是教的。


    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年3月14日 上午 08:55
  • 自作聰明的寫法, 還標示自己為解答, 你自己喜歡自作聰明亂寫就算了, 不要害到以後看到這篇文的人, 還真的以為那是正確的解決方法.
    2012年3月14日 上午 09:04
  • 但我看過post, 每個user 都會有一份copy, 又怎會共用一條connection?!

    Login 時都會open 一次connection


    心癮又會想偷一個敏



    • 已編輯 沈世鈞 2012年3月14日 上午 09:10
    2012年3月14日 上午 09:08
  • 但我看過post, 每個user 都會有一份copy, 又怎會共用一條connection?!

    心癮又會想偷一個敏

    你如果放在靜態成員裡面,當然就是同一份。

    還是你也不懂static的意義?


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:


    小弟的blog: In 91,wiki: my wiki

    2012年3月14日 上午 09:10
    版主
  • 91哥, 他開心就好了, 子曰: 糞土之牆不可杇也. 多說無益.
    2012年3月14日 上午 09:13
  • 太感動, 原來是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/

    2012年3月14日 上午 09:17
    版主
  • 如果可以share non-static Sqlconnection , 那不就可以做到以上效果嗎?

    心癮又會想偷一個敏

    2012年3月14日 上午 09:24
  • 如果您要宣告Static,建議是把Connection String宣告在Static而不是Connection

    Connection的使用要越短越好,最好是能夠確保使用後能夠馬上釋放出去,讓他在Connection Pool

    裡面等待下一個人使用。

    所以建議是使用Using去宣告Connection,讓他在End Using的時候可以自動的Close並且Dispose

    ^_^


    topcat(姍舞之間的極度凝聚)http://www.dotblogs.com.tw/topcat/

    2012年3月14日 上午 09:46
    版主
  • 如果您要宣告Static,建議是把Connection String宣告在Static而不是Connection

    Connection的使用要越短越好,最好是能夠確保使用後能夠馬上釋放出去,讓他在Connection Pool

    裡面等待下一個人使用。

    所以建議是使用Using去宣告Connection,讓他在End Using的時候可以自動的Close並且Dispose

    ^_^


    topcat(姍舞之間的極度凝聚)http://www.dotblogs.com.tw/topcat/

    小喵,沒用的,這我在他前幾天的發問已經說過了。聽不進去,神仙難救無命客。

    請看

    1. http://social.msdn.microsoft.com/Forums/zh-TW/236/thread/67f7ad96-cda3-43b8-b16d-267b127ee758#16c737cd-7875-4999-bfd3-525529e5db41
    2. 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

    2012年3月14日 上午 09:54
    版主
  • 另有一個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/

    2012年3月15日 上午 01:16
  • 太感動, 原來是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://www.dotblogs.com.tw/mis2000lab/archive/2011/04/07/connection_pool_20110407.aspx

    原文出處:http://msdn.microsoft.com/zh-tw/library/8xx3tyca.aspx


    SQL Server 連接共用 (ADO.NET)
    SQL Server Connection Pooling (ADO.NET)


    我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/

    2012年3月15日 上午 01:20
  • 另有一個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/


    2012年3月15日 上午 01:55
  • 算了, 我不這樣close connection就是
    2012年3月15日 上午 02:34
  • 重點不是「你程式有錯!」

    你是「觀念」有錯!

    錯誤一:

    網頁程式執行完畢,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/

    2012年3月16日 上午 07:48
  • 我的媽!

    大哥您就是以前那位名人,想寫書的那個啊
    http://social.msdn.microsoft.com/Forums/zh-TW/800/thread/fb1827a1-ec2f-46e4-b294-b40abc14ef7b

    失敬!失敬!

    您應該是「MSDN論壇的小婷」了,當之無愧

    IT技術論壇發問 亂的三次方

    http://itgroup.blueshop.com.tw/inmarkblue/markshu?n=convew&i=303843


    我的書 與 ASP.NET教學網站 http://www.dotblogs.com.tw/mis2000lab/

    2012年3月16日 上午 08:08