问题描述
我用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对这个问题的分析理解真的让我感到有点忽然遇到“南辕北辙”的意外。