今天在论坛上我问的一个白痴问题--SqlConnection自动关闭问题
原来的ado.net 连接池的知识在1.1就看过了,可是看过就忘记了,直到今天才把这个基础知识给掌握了,原文的问题是
string connectionString = "server=192.168.1.2;user id=××××;password=test;database=××××;min pool size=4;max pool size=40;packet size=3072";
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 ,当然这个是不提倡用的,因为连接池减少了与数据库频繁连接的开销。