asp.net项目发布到iis上时,连接数达512

ice9ying 2011-08-18 03:47:49
RT,调试的时候没有任何问题,但发布到iis上时,多点十几下连接数就会到达512

页面提示错误,查找源头是这个方法,但该释放、该关闭的都释放关闭了,还有什么方法?在配置文件上也写了限制,可还是报错

/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程的名称</param>
/// <param name="prams">存储过程所需参数</param>
/// <param name="dataSet">返回DataReader对象</param>
public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader)
{
///创建Command
SqlCommand cmd = CreateProcCommand(procName, prams);

try
{
///读取数据
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception ex)
{

dataReader = null;
//dataReader.Close();
///记录错误日志
SystemError.CreateErrorLog(ex.Message);
}
finally
{
cmd.Dispose();
}

}
...全文
127 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ice9ying 2011-08-19
  • 打赏
  • 举报
回复
我是帮人问的,恩,我也学习了,谢谢~
.云哲. 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]

执行cmd.Dispose有什么意义?你搞错了目标对象。

你返回的dataReader变量如何保证及时Dispose?如果你没有什么靠谱的担保,那么最好修改你的设计,让RunProc直接返回数据集合,而不要返回DataReader。
[/Quote]

++
happytonice 2011-08-18
  • 打赏
  • 举报
回复
先把封装去掉,直接把代码写在一起,试试。
gengchenhui 2011-08-18
  • 打赏
  • 举报
回复
wslxxd
unling 2011-08-18
  • 打赏
  • 举报
回复
sp1234 说的很对
使用Using 自动释放链接
你的是cmd 释放了,但是你的SqlConnect链接没有Open
ldk 2011-08-18
  • 打赏
  • 举报
回复
sqlconnection在哪儿打开的?
子夜__ 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sp1234 的回复:]

C# code
SqlCommand cmd = CreateProcCommand(procName, prams);
using(SqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
while(dataReader.Read())
{
调……
[/Quote]
赞同。
chen_ya_ping 2011-08-18
  • 打赏
  • 举报
回复
是不是有些sqldatareader没有dispose,尤其是在发生异常的情况下
还有可以在调用结束以后调用conn。close()方法
  • 打赏
  • 举报
回复
  SqlCommand cmd = CreateProcCommand(procName, prams);
using(SqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
while(dataReader.Read())
{
调用方法处理一条记录(datareader);
}
}


或者
  SqlCommand cmd = CreateProcCommand(procName, prams);
using(SqlDataReader dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
调用方法处理遍历整个结果集和(datareader);
}

这包括了你的全部代码代码,写起来也不复杂啊。你何必把它搞什么封装呢?直接在调用你的RunProc的原来的地方直接这样写不就好了嘛。就算你封装什么RunProc方法,别人也没有必要用它啊。
  • 打赏
  • 举报
回复
实际上ado.net已经很精简了,你可以在其它地方去包装,而对于执行ExecuteReader这条语句没有必要搞什么包装。

///创建Command
SqlCommand cmd = CreateProcCommand(procName, prams);

///读取数据
using(SqlDataReader dataReader = cmd.ExecuteReader())
{
while(dataReader.Read())
{
进行你的处理
}
}
[/code]
你完全没有必要把它封装为什么单独的方法。
rungoosc 2011-08-18
  • 打赏
  • 举报
回复
问题可能在 CommandBehavior.CloseConnection 里面吧
没有正常关闭数据库连接。
  • 打赏
  • 举报
回复
执行cmd.Dispose有什么意义?你搞错了目标对象。

你返回的dataReader变量如何保证及时Dispose?如果你没有什么靠谱的担保,那么最好修改你的设计,让RunProc直接返回数据集合,而不要返回DataReader。
ice9ying 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 billrobin 的回复:]
if dt!=null
{
dt=null;
}
[/Quote]
??????
billrobin 2011-08-18
  • 打赏
  • 举报
回复
if dt!=null
{
dt=null;
}
ice9ying 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuchaolin 的回复:]
回收应用程序池
[/Quote]

怎么做?
md5e 2011-08-18
  • 打赏
  • 举报
回复
回收应用程序池
renerke 2011-08-18
  • 打赏
  • 举报
回复
我学习!~你等一会,我把子夜叫过来,给你说说!
ice9ying 2011-08-18
  • 打赏
  • 举报
回复
出错日志:

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

62,072

社区成员

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

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

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

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