有關數據庫連接自動關閉的問題

using (SqlConnection Conn = new SqlConnection(connectionString))
            {
                Conn.Open();
                SqlCommand Cmd = Conn.CreateCommand();
                Cmd.CommandText = "select top 1 * from Book_Info";
                using (SqlDataReader Reader = Cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    Reader.Close();
                }

              Conn.Close();
            }
爲什麼這樣數據庫連接沒關閉,確切的說應該是連接池並沒斷開,我把兩者混成一個,因爲在asp裏是一個 。

先說說爲什麼會覺得他沒關閉。公司剛剛從asp轉到asp.net,服務器原來使用asp連接數據庫的時候,數據庫都是連上-操作-斷開,數據庫連接信息中也就很少幾個連接,畢竟併發
的人數也不會那麼多。
轉到asp.net以後,數據庫連接就有很多個,明明已經close了,但是還是那麼多個,所以那問了上面那個比較白癡的問題。

首先,先說asp.net的close 和asp 裏close的區別,asp裏的close是真的和數據庫斷開,下次使用時候再次連接。
asp.net裏的ado.net是把連接交給了連接池去管理,close的時候只是還給連接池一個連接,open的時候再從連接池裏拿會一個可用連接。所以連接池裏有多少個連接是ado.net在控制,
跟asp.net裏的close是無關的,這樣的話,自然不會影響數據庫上的連接數減少。

其次說說CommandBehavior.CloseConnection 這個用Reflector可以查到如下代碼
bool flag2 = this.IsCommandBehavior(CommandBehavior.CloseConnection);
if (flag2 && (this.Connection != null))
            {
                this.Connection.Close();
            }

自然是自動關閉的

最後就是說說連接字符串的問題了
//string connectionString = "server=192.168.1.2;user id=×××;password=test;database=****;min pool size=40;max pool size=40;packet size=3072";

min pool size=40;max pool size=40 這裏一個設置最小連接池數和最大連接池數,需要注意的是,如果象這樣設置,第一個數據庫連接,連接池會再建立連接後,繼續建立連接,直到40個爲址

那麼怎麼設置成跟asp中ado一樣呢,只使用一個連接,需要在連接語句中添加pooling=false ,當然這個是不提倡用的,因爲連接池減少了與數據庫頻繁連接的開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章