超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大[转]

 
 ASP.NET c#在使用SqlDataReader读取数据的时候,出现这个提示,在网上找了一些回答也没有解决问题,最终还是看微软的PetShop找到了答案。
我在一个循环中使用了SqlDataReader:
        using (SqlDataReader reader = SqlHelper.ExecuteReader("select * from region where fatherid=0"))
        {
            while (reader.Read())
            {
                // 把省一级的区划存储到一个 Dictionary 中备用
                Province.Add(reader["name"].ToString(), int.Parse(reader["id"].ToString()));
            }
        }
虽然是在 using 语句中声明的 SqlDataReader,但程序运行几次之后还是出现了标题给出的的那个错误。在Sql Server 2005的 Manage Studio 中检查进程信息时,发现只要程序运行一次,就会出现几十个数据库的连接没有关闭(运行一次应该是读取了30多个省份的信息)。运行两三次后程序就崩溃了,进程信息达到120多个的时候就崩溃了。
于是就很奇怪,该关闭的Connection也都关闭了,Connection 和 SqlDataReader都是在using语句中声明的,怎么会连接不关闭呢?
对比了我写的SqlHelper类和PetShop中的SqlHelper类中的ExecuteReader方法后发现,他的ExecuteReader方法中的cmd.ExecuteReader()调用了一个参数:CommandBehavior.CloseConnection。
如下:cmd.ExecuteReader(CommandBehavior.CloseConnection)
这个参数MSDN中的解释是:在执行该命令时,如果关闭关联的 DataReader 对象,则关联的Connection 对象也将关闭。
也就是说,如果只在using语句中声明SqlDataReader是严密的,那样只是在程序结束后关闭了SqlDataReader,而和他关联的Connection并没有关闭(或者说释放),因此,对于这种有关联对象打开的情况,还必须明确的把关联的对象也关闭,也就是CommandBehavior.CloseConnection参数提供的功能。
使用了这个参数后,运行多次该程序也没有出现问题,进程信息中的连接数也总是保持在20多个,其中大概20个都是系统的连接。
1
0
(请您对文章做出评价)
« 博主前一篇: HashPasswordForStoringInConfigFile中的Md5算法并非常用的Md5算法
» 博主后一篇: Microsoft .NET Pet Shop 4:将 ASP.NET 1.1 应用程序迁移到 2.0
posted @ 2010-05-28 09:13 smodi 阅读(1494) 评论(2) 编辑 收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值