提示连接池已达到最大数,但连接都关闭了!是关闭的方法不对还是其他原因??

net_net 2006-01-22 11:59:00
几乎每个页面都打开连接了
Dim strconn As String = System.Configuration.ConfigurationSettings.AppSettings("dd")
Dim conn As New SqlClient.SqlConnection(strconn)
conn.Open()

关闭
conn.close()
conn.dispose()

这样关闭不行吗?怎么监视打开的连接数?
出现这种情况的时候,一般都是在晚上业务不忙的时候,白天业务量很大也没出现这个情况!!
麻烦各位帮忙看一下是什么原因,这种情况已经持续了两个多月了!!
...全文
813 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
j__jake 2006-05-15
  • 打赏
  • 举报
回复
学习了
我正好碰上同样的问题
胖河马 2006-01-23
  • 打赏
  • 举报
回复
我分析是这样的:因为.net通过gc管理内存,所以没有Close的Connection对象在失去引用后,最终还是会被释放,不会导致连接池爆满,但是因为gc是在托管内存不足时才开始回收内存,所以这需要一个过程。白天业务繁忙会经常发生内存回收,所以没关闭的Connection会被很快的放回池中,而晚上因为业务较少,托管内存比较富裕所以才导致大量的连接等待回收就会产生这种错误,所以还是养成要养成良好的编程习惯,及时关闭Connection。

在开发阶段可以在连接字符串中增加“Max Pool Size=1”指定连接池的最大大小为1,这样很快就可以发现这种问题。

打开的连接数可以在企业管理器中的管理\当前活动\进程信息中查看。
xiaostar007 2006-01-23
  • 打赏
  • 举报
回复
up
wenquan_nn 2006-01-23
  • 打赏
  • 举报
回复
数据层的类继承IDisposable接口,并重写Dispose方法(关闭相关链接和释放资源),
业务层调用的时候使用using(...){}的方式,这样就没问题了!
gngnandgngn 2006-01-23
  • 打赏
  • 举报
回复
在数据访问层里写打开和关闭啊,这样上层代码就不用随时记着了
bingbingcha 2006-01-23
  • 打赏
  • 举报
回复
如果你是自己写的封套SQL操作的类..

单独实现一个Dispose函数..释放这个类中声明的所有资源...在业务中使用该类后,调用Dispose.
混世罗汉 2006-01-23
  • 打赏
  • 举报
回复
以下是我以前为了这个问题,最终得到的经验:

六、关于:
我做的.net程序,c#的。那个首页 index.aspx,打开执行一段时间后,时间不一定。有时再重新访问这个index.aspx时,就提示:


超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。

原因:那是因为开发conn.open没有关,引起连接池爆满了,或关了不彻底,占了资源,

解决方案:

1、把conn.close()关一下,或conn.dispose()就行了。
2、dr要记得随时关了。
3、最好的方法是:
修改web.config,sql连接语句,改成如何:就是修改连接池的数量:
512什么的。

<add key="dns" value="Initial Catalog=Clfilm;Data Source=(local);User ID = sa; Password=ren;Enlist=true;Pooling=true;Max Pool Size=300;Min Pool Size=0;Connection Lifetime=300;user id=sa;packet size=1000
"/>

另外,sqlserver数据库请升级到sp4,或重新装一下。

一般来说,如果程序不分层的话,就一层结构的话,dr.close()以后,conn.close()这样写不会错。且发现,本来sql占80M,现在只有30M左右了


如果是分层的话,dr.close()以后,conn.close()这样写就会错,因为dr关了以后,conn就关了。就是这样。所以也没必要conn.close()了
sgh321 2006-01-23
  • 打赏
  • 举报
回复
这种方法可能也有问题,最好写成一个链接来调用。或采用思归的方法。
LoveMango 2006-01-23
  • 打赏
  • 举报
回复
MARK
misng 2006-01-23
  • 打赏
  • 举报
回复
Function Opendb(ByVal strsql)
Dim strconn As String = System.Configuration.ConfigurationSettings.AppSettings("dd")
Dim conn As New SqlClient.SqlConnection(strconn)
conn.Open()
Dim dm1 As New SqlClient.SqlCommand(strsql, conn)
Dim rs1 As SqlClient.SqlDataReader
rs1 = dm1.ExecuteReader()
Return rs1
End Function

这里就只open了没有close
time_is_life 2006-01-23
  • 打赏
  • 举报
回复
mark
net_net 2006-01-23
  • 打赏
  • 举报
回复
谢谢各位,问题解决了!!
仔细查了一遍程序,确实有个地方连接没关闭,并且用的比较频繁。
观察了一上午,发现SQL进程里最多4、5个.net连接,少的时候一个。
另外还发现跟开发环境有关,现在我用的是.net2003才出现的这个问题,原来用.net2000的时候没事。
qhh389 2006-01-22
  • 打赏
  • 举报
回复
看你下你晚上业务不忙的之后用到了那些白天不太用的模块,,仔细检查下他们有么有连接没关闭的,
saucer 2006-01-22
  • 打赏
  • 举报
回复
make sure you are closing the connection inside finally

Dim conn As New SqlClient.SqlConnection(strconn)

try
conn.Open
...
finally
conn.Close
end try

if you are using VS 2005, then


Using conn As New SqlClient.SqlConnection(strconn)
...
End Using

also, try to stress test your application, increase Max Pool Size if necessary
真相重于对错 2006-01-22
  • 打赏
  • 举报
回复
肯定有没关的
Oldman 2006-01-22
  • 打赏
  • 举报
回复
可能你的连接池里面的连接数设得太小了也是可能的
califord 2006-01-22
  • 打赏
  • 举报
回复
你做一下异常处理try catch finally
handsome0916 2006-01-22
  • 打赏
  • 举报
回复
conn.Open()
Dim dm1 As New SqlClient.SqlCommand(strsql, conn)
Dim rs1 As SqlClient.SqlDataReader
rs1 = dm1.ExecuteReader()
Return rs1
conn.close()
net_net 2006-01-22
  • 打赏
  • 举报
回复
我看了一下只有一个地方没关,在一个模块里面有两个嵌套过程GetXML和OpenDB
Function Opendb(ByVal strsql)
Dim strconn As String = System.Configuration.ConfigurationSettings.AppSettings("dd")
Dim conn As New SqlClient.SqlConnection(strconn)
conn.Open()
Dim dm1 As New SqlClient.SqlCommand(strsql, conn)
Dim rs1 As SqlClient.SqlDataReader
rs1 = dm1.ExecuteReader()
Return rs1
End Function
Function GetXML(ByVal strSQL As String) As String
Dim rs As SqlClient.SqlDataReader
rs = Opendb(strsql)
Dim sb As New System.Text.StringBuilder
Dim j As Integer
sb.Append("<?xml version='1.0'?><Root>")
While rs.Read
sb.Append("<row>")
For j = 0 To rs.FieldCount - 1
sb.Append("<" & rs.GetName(j).ToString & ">")
sb.Append(Trim(rs.GetValue(j).ToString))
sb.Append("</" & rs.GetName(j).ToString & ">")
Next
sb.Append("</row>")
End While
rs.Close()
sb.Append("</Root>")
GetXML = sb.ToString
If GetXML = "<?xml version='1.0'?><Root></Root>" Then
GetXML = "<?xml version='1.0'?><Root><row><type>0</type></row></Root>"
End If
rs.Close()

End Function

只有这个过方没有关闭
怎么查看当前连接池数???
zhangyang555 2006-01-22
  • 打赏
  • 举报
回复
仔细检查,肯定有没释放的地方
加载更多回复(1)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧