ASP.Net中连接池释放问题DataReader释放后连接为Sleeping

问题描述

我用ASP.NET制作的一个登录页面,查询用户名和密码,返回用户部门及权限等许多信息。将登录查询封装在类中。返回SqlDataReader代码如下publicSqlDataReaderlogin(stringuname,stringpassword){SqlConnectioncon=newSqlConnection(ConfigurationManager.ConnectionStrings["QJCC"].ConnectionString);SqlCommandcmd=newSqlCommand("login_staff",con);cmd.CommandType=CommandType.StoredProcedure;cmd.Parameters.Add("@s_name",SqlDbType.VarChar,50).Value=uname;cmd.Parameters.Add("@s_password",SqlDbType.VarChar,16).Value=password;con.Open();try{SqlDataReaderdr=cmd.ExecuteReader(CommandBehavior.CloseConnection);returndr;}catch(Exceptionerr){thrownewSystem.Exception(err.Message);}finally{cmd.Dispose();}}

login.aspx中调用,代码如下:protectedvoidbtn_login_Click(objectsender,EventArgse){stringuname=this.tname.Text.Trim().ToString();stringupass=FormsAuthentication.HashPasswordForStoringInConfigFile(this.tpass.Text.Trim().ToString(),"MD5");Staffstaff_login=newStaff();SqlDataReaderdr_staff=staff_login.login(uname,upass);if(dr_staff.Read()){ints_status=Convert.ToInt32(dr_staff["s_status"].ToString());if(s_status!=1){Response.Write("<script>alert('该员工已经离职,登录失败!')</script>");}else{Session["uname"]=uname;if(Session["uname"].ToString()!=""){Session["staffid"]=Convert.ToInt32(dr_staff["s_id"].ToString());}else{Session["staffid"]=0;}Session["position"]=dr_staff["p_name"].ToString();if(Session["position"].ToString()!=""){Session["positionid"]=Convert.ToInt32(dr_staff["p_positionid"].ToString());}else{Session["positionid"]=0;}Session["department"]=dr_staff["d_name"].ToString();if(Session["department"].ToString()!=""){Session["departmentid"]=Convert.ToInt32(dr_staff["d_departmentid"].ToString());}else{Session["departmentid"]=0;}Session["group"]=dr_staff["g_name"].ToString();if(Session["group"].ToString()!=""){Session["groupid"]=Convert.ToInt32(dr_staff["g_groupid"].ToString());}else{Session["groupid"]=0;}dr_staff.Close();Response.Redirect("index.aspx");}}else{dr_staff.Close();Response.Write("<script>alert('用户名或密码错误!')</script>");}}

我在ExecuteReader执行时使用了CommandBehavior.CloseConnection,并关闭了dr_staff.Close();为什么我用SP_who查询,发现连接池中连接.NetSqlclientDataProvider仍然存在。只是Status为sleepingCommand为AWAITINGCOMMAND。即使关闭了页面,这个连接也要过几分钟才释放。这样的话,100台以上的机器登录网页,连接池不就不够用了?还是说sleeping的连接已经释放了?公司几千人,请问怎样释放连接?还有,关闭网页的时候怎么强制关闭连接?

解决方案

解决方案二:
正常,连接关闭后放入连接池,可以再次使用
解决方案三:
搞错了,应该是不正常。看看这个网址,看看有没有未正常关闭的连接http://www.netortech.com/Blog/Entry/3/Searching-out-connection-leaks-in-Microsoft-SQL
解决方案四:
是不是条件分支语句没有覆盖到?尝试把dr_staff.Close();放到代码的最后,保证其执行。
解决方案五:
引用3楼dalmeeme的回复:

是不是条件分支语句没有覆盖到?尝试把dr_staff.Close();放到代码的最后,保证其执行。

关闭了,我测试了其他的close(),sp_who中都能查到sleeping的连接!
解决方案六:
1如果发生了异常,那么你的con就没有close2你的分支里面有问题,没有覆盖到。if(s_status!=1)里面就没有关闭
解决方案七:
引用4楼e_tonytang的回复:

引用3楼dalmeeme的回复:是不是条件分支语句没有覆盖到?尝试把dr_staff.Close();放到代码的最后,保证其执行。关闭了,我测试了其他的close(),sp_who中都能查到sleeping的连接!

没测试过。close之后sp_who还能查到连接?那dispose之后看看还有吗?
解决方案八:
引用6楼charles_y的回复:

引用4楼e_tonytang的回复:引用3楼dalmeeme的回复:是不是条件分支语句没有覆盖到?尝试把dr_staff.Close();放到代码的最后,保证其执行。关闭了,我测试了其他的close(),sp_who中都能查到sleeping的连接!没测试过。close之后sp_who还能查到连接?那dispose之后看看还有吗……

还是有的!
解决方案九:
引用5楼jiezi316的回复:

1如果发生了异常,那么你的con就没有close2你的分支里面有问题,没有覆盖到。if(s_status!=1)里面就没有关闭

确实是。但是我调试时看到datareader关闭的。还是能查到sleeping的连接!
解决方案十:
什么叫做连接池?连接池的概念就是不随便释放连接!lz的分析理解真的让我感到意外。
解决方案十一:
什么叫做连接池?连接池的概念就是不随便释放连接!lz对这个问题的分析理解真的让我感到有点意外。
解决方案十二:
什么叫做连接池?连接池的概念就是不随便释放连接!lz对这个问题的分析理解真的让我感到有点忽然遇到“南辕北辙”的意外。

时间: 2024-08-31 11:26:54

ASP.Net中连接池释放问题DataReader释放后连接为Sleeping的相关文章

可以介绍一下c3p0连接池和自己写的向量连接池的区别么?

问题描述 可以介绍一下c3p0连接池和自己写的向量连接池的区别么? 可以介绍一下c3p0连接池和自己写的Vector向量连接池的区别么? 解决方案 一个是系统的 一个是自定义的

Apache Geronimo JNDI命名和Java资源连接池,第1部分: 数据源连接

利用 JNDI 访问数据源.Java 消息服务.邮件会话和 URL 连接的连接池 了解 JNDI JNDI 是一种应用程序编程接口 (API) 或库,它为应用程序提供了将名称与对象关联起来以及根据对象的名称在目录中查找对象的方法.本文是系列教程的第一部分,阅读本文可以让您了解如何将 Geronimo.JNDI 与数据源连接池相互关联起来,如何构建数据源连接,以及如何利用 JNDI 在一个简单的 Geronimo 应用程序(称为 Customer Service 实用程序)内访问该连接. 数据源

dbcp连接池不合理的锁导致连接耗尽

应用报错,表象来看是连接池爆满了. org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted at org.springf

ASP.NET中对SQLITE数据库进行插入操作后返回自增的ID

 啥也不说了,刚刚研究出来滴~~~贴码:         /// <summary>插入        /// 返回刚刚插入的ID        /// </summary>        /// <param name="groupname"></param>        /// <param name="gid"></param>        /// <returns><

连接池用完如何回收到池中,并保证连接池的连接数量

问题描述 哪位可以详细的介绍一下,连接池用完是如何放回池中的,并保证连接池的数量,请详细说一下实现原理,最好有代码,谢谢啦 解决方案 你要自己实现一个连接池?如果不是的话,你也不需要深究其原理,如果你真的想知道的话,那么,你可以去看一下 DBCP 的源码,它是 Tomcat 自带的.其实,它的原理就跟线程池差不多.大概是这个样子的,用一个容器,比如,一个 List,在初始化的时候,就往这个 List 里面存入 10 个 Connection ,然后你需要的话,就从这个 List 中取一个,如果多

ODP.NET连接池释放问题

问题描述 大牛们:关于使用odp.net连接操作oracle数据库时连接的释放问题,请教大家,问题如下:连接串:DataSource=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=filesynctest2)(PORT=1521))(CONNECT_DATA=(SID=filesync1)));UserId=xjliu;Password=111111;MaxPoolSize=10;MinPoolSize=1;问题:在默认使用连接池的情况下,程序在查询或操作数

C3p0连接可以设定最大连接数么?连接池中最多可以存在的连接个数?

问题描述 C3p0连接可以设定最大连接数:连接池中最多可以存在的连接个数?如果没有这个参数,连接太多的话,数据库岂不承受不了. 问题补充:caizi12 写道 解决方案 不是空闲的,是指整个连接池总共的连接数,至于连接是使用还是空闲,是C3P0在使用时自己去管理的如果请求连接数超出了连接池数量的话,需要等待有连接从使用返回空闲状态才能继续分配但是有一个问题是lz需要考虑的:1. 使用连接池需要有良好的上层构架,要保证对数据库连接的使用被限制在最小范围,一旦连接使用完毕要及时而快速的归还给连接池2

.Net开发中TCP反向代理、Socket 连接池和数据包解析器教程

TCP反向代理 一般的Web反向代理大家很熟悉了,主要是通过在客户端和服务端之间架设一层代理服务器,转发客户端的请求至服务端或数据库,并将结果回复给客户端. 其特点主要有: 1.缓存一些数据库I/O过重.却更新不频繁的数据,或者静态数据,如文件.图片等.2.隔离客户端(公网)和服务端(windows服务.Web服务.文件服务),仅将反向代理服务器的IP.名称.host和端口等暴露给公网.3.基于第2点,其应该是轻量的.可随时重启的,这在服务端自身所在的服务器重启代价较高或不能忍受重启的条件下,极

用连接池提高Servlet访问数据库的效率 (-)

servlet|访问|数据|数据库 Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本.Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据.本文介绍一种充分发挥该特色的实用技术,即数据库连接池. 一.实现连接池的意义 动态Web站点往往用数据库存储的信息生成Web页面,每一个页面请求导致一次数据库访问.连接数据库不仅要开销一定的通讯和内存资源,还必须完成用户验证.安全上下文配置这类任务,因而往往成为最为耗时的