{
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 ,當然這個是不提倡用的,因爲連接池減少了與數據庫頻繁連接的開銷。