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个都是系统的连接
分享到:
相关推荐
出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 file:DataBaseHlper.cs : 52 2012-10-23 10:15:23 [Error]: connect database error . file: : 0 2012-10-23 10:15:33 [Error]: 正在中止线程。 ...
`getConnection()`方法负责从池中获取连接,如果池中没有空闲连接且总连接数未达到最大值,就创建新的连接;`returnConnection()`方法用于归还连接,同时检查连接是否合法,防止重复归还。`cleanUp()`方法定期清理...
而“在指定的时间内,不再使用时,释放”,指的是连接池设置了一个超时时间,如果连接在该时间内没有被再次使用,它会被真正的关闭以释放资源。 在C#中,使用数据库连接池的操作通常是这样的: 1. 创建...
数据连接池在初始化时会创建一定数量的数据库连接并存储在池中,当应用需要连接数据库时,可以从池中获取已存在的连接,而不是每次都创建新的连接。使用完毕后,连接会被归还到池中,而不是关闭,这样可以避免频繁地...
在.NET应用程序中,可以通过调整连接池的参数来优化其性能,例如最大连接数(MaxPoolSize)、最小连接数(MinPoolSize)以及空闲超时时间(ConnectionTimeout)。通过合理设置这些参数,可以避免资源浪费,同时确保...
在.NET框架中,数据库连接管理是一项关键任务,因为频繁创建和销毁数据库连接会消耗大量系统资源,影响应用程序的性能。为了优化这一过程,C#引入了数据库连接池(Connection Pooling)技术。本文将深入探讨如何...
半开连接数是指TCP连接在三次握手过程中已完成SYN(同步序列编号)阶段,但尚未收到ACK(确认)的连接。这种状态的连接可能因某些原因(如客户端故障、网络延迟等)未完成建立,但仍占用服务器资源。为了防止过多的...
2. **最大活跃数**:允许同时获取但尚未返回到池中的活动连接的最大数量。超过这个数量的请求将被阻塞,直到有连接归还到池中。 3. **最大空闲数**:池中最多可保持的空闲连接数。当空闲连接数超过此值时,多余的...
如果没有空闲连接且连接池尚未达到最大容量,则创建新连接并将其添加到池中。如果连接池已满,新的连接请求会被排队等待,直到有空闲连接可用或连接尝试超时。 #### 三、关键参数详解 在ADO.NET中,连接池的行为...
**ORA-17015**:ResultSet 获取错误,通常发生在尝试从 ResultSet 中获取数据时出现问题。 **ORA-17016**:ResultSet 超时错误,当 ResultSet 在指定时间内无法完成操作时发生。 #### ORA-17017 至 ORA-17025:...
在C#编程中,数据连接是与数据库交互的基础,它允许开发者执行SQL查询、更新数据库内容或检索数据。本文将详细探讨C#中的数据连接及其常用状态,旨在帮助你更好地理解和掌握这一关键概念。 首先,我们需要了解ADO...
在某些情况下,如服务器无响应,`connect`可能会长时间等待,直到达到默认的超时时间(通常是75秒)。 为了解决这个问题,我们可以使用非阻塞模式的`connect`。通过设置套接字的非阻塞标志,`connect`调用不会立即...
在使用ADSL(Asymmetric Digital Subscriber Line,非对称数字用户线路)进行网络连接时,可能会遇到各种错误代码,这些代码通常指示了连接失败的具体原因。以下是对部分常见ADSL连接错误代码的详细解析,旨在帮助...
在使用Paramiko进行远程命令执行时,可能会遇到命令执行超时的问题,尤其是在执行长时间运行的命令时。这个问题通常与Paramiko如何处理命令的输出和等待其完成有关。 首先,我们来看两种常见的解决超时问题的尝试:...
通常发生在多线程或多进程环境中,当两个或多个进程同时尝试获取同一资源时可能发生此情况。 #### 0102 - 标志已经设置,无法关闭 这意味着当前试图关闭的标志已经被设置,并且不能被关闭。这可能是因为标志的当前...
- **设备已连接、供电但发生连接超时错误**:设备已连接到USB、已供电,但发生了连接超时错误。 #### 五、供电状态 - **自供电**:设备可以从外部获取电源,而非通过USB总线供电。 - **总线供电**:设备通过USB...
Microsoft Windows 系统错误代码简单分析: 0000 操作已成功完成。 0001 错误的函数。... 1058 服务无法启动,可能因为被禁用,也可能因为没有关联的可用设备。 1059 已经指定了循环服务的从属关系。 ...
在服务器运维与管理过程中,了解Apache服务器的并发连接情况对于评估服务器性能、优化资源分配至关重要。通过查看Apache并发链接,我们可以直观地了解到Apache的负载状况,进而采取相应措施提高服务器性能。 #### ...
如果你尚未安装,可以从MySQL官方网站下载最新版本的驱动包,将其解压后将`mysql-connector-java-x.x.x.jar`文件复制到Myeclipse的`lib`目录下,或者添加到项目的类路径中。 接下来,我们将通过以下步骤来建立...
在OFBiz 11版本中,数据库配置是系统运行的关键部分,因为它决定了如何连接和操作数据存储。以下是关于OFBiz 11数据库配置的详细说明: 1. **MySQL配置**: - **添加JDBC驱动**:首先,你需要将MySQL的JDBC驱动...