现在的位置: 首页 > 综合 > 正文

有关数据库连接自动关闭的问题

2013年01月12日 ⁄ 综合 ⁄ 共 1360字 ⁄ 字号 评论关闭

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 ,当然这个是不提倡用的,因为连接池减少了与数据库频繁连接的开销。

抱歉!评论已关闭.