IIS相关问题.(超时时间已到。超时时间已到,但是尚未从池中获取连接。)

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

网站时常报这样的错误,查看代码,所有链接都已经关闭.
回收程序池之后,错误立即解除.
.net framework 2.0
iis6.0
服务器2003 X64
内存:8G
错误代码:

应用程序信息:
应用程序域: /LM/W3SVC/2112557531/Root-1-130594627685000000
信任级别: Full
应用程序虚拟路径: /
应用程序路径: F:\website\51tou\Web\
计算机名: iZ23y4o9xm6Z

进程信息:
进程 ID: 28748
进程名: w3wp.exe
帐户名: NT AUTHORITY\NETWORK SERVICE

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

请求信息:
请求 URL: http://www.myr9.com/3dxhq/detail/default.aspx?id=101440
请求路径: /3dxhq/detail/default.aspx
用户主机地址: *.*.246.86
用户:
是否已经过身份验证: False
身份验证类型:
线程帐户名: NT AUTHORITY\NETWORK SERVICE

线程信息:
线程 ID: 6
线程帐户名: NT AUTHORITY\NETWORK SERVICE
是否正在模拟: False
堆栈跟踪: 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
在 System.Data.SqlClient.SqlConnection.Open()
在 DBPicHelper.Query(String SQLString)
在 jetlau.Web._3dxhq.detail._default.GetGirl()
在 jetlau.Web._3dxhq.detail._default.Page_Load(Object sender, EventArgs e)
在 System.Web.UI.Control.OnLoad(EventArgs e)
在 System.Web.UI.Control.LoadRecursive()
在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


自定义事件详细信息:

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
...全文
1885 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
IssacChow 2014-11-05
  • 打赏
  • 举报
回复 1
相关资料: http://bbs.csdn.net/topics/20356668#post-14298660 http://www.educity.cn/wenda/390800.html
IssacChow 2014-11-05
  • 打赏
  • 举报
回复
因为程序没有源码,只有发布文件,所以,无法对程序做出修改. 做了一个比较折中的办法, 1.对链接字符串增加max pool size 2.对连接数进行删除.即:杀死超时未动的连接. --2.1 新建存储过程 --2.2 建立JOB,执行存储过程 ----2.2.1 数据库服务器-->管理-->维护计划-->新建维护计划-->执行"T-SQL语句"任务 ----2.2.2 输入:use master exec killspid '数据库名' ----2.2.3 作业计划属性(右上角的日历图标)-->频率(每天,间隔1)-->每天频率(执行间隔:XX小时)


USE [master]
GO


/****** Object:  StoredProcedure [dbo].[killspid]    Script Date: 11/05/2014 09:41:59  by Issac******/
SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO


ALTER  PROC  [dbo].[killspid]  (@dbname  VARCHAR(20))  
AS  
BEGIN  
DECLARE  @SQL  nvarchar(500)  
DECLARE  @spid  INT  
SET  @SQL='declare  getspid  cursor  for    
select  spid  from  sysprocesses  where  dbid=db_id('''+@dbname+''') and status=''sleeping''AND last_batch < dateadd(MINUTE, - 30, getdate()) AND login_time < dateadd(MINUTE, - 30, getdate())'  
--
EXEC  (@SQL)  
OPEN  getspid  
FETCH  NEXT  FROM  getspid  INTO  @spid  
WHILE  @@fetch_status  <  >-1  
BEGIN  
EXEC('kill  '+@spid)  
FETCH  NEXT  FROM  getspid  INTO  @spid  
END  
CLOSE  getspid  
DEALLOCATE  getspid  
END  

IssacChow 2014-11-05
  • 打赏
  • 举报
回复
引用 12 楼 sp1234 的回复:
[quote=引用 6 楼 a271083650 的回复:] 经过仔细检查,数据库连接都有关闭. 但是,去分离数据库时,看到数据库连接数只增不减. 也就是没有关闭连接, 而,超时一下之后,回收程序池,数据库链接没有减,而网站又可以跑起来
我从来不写 DbConnection.Close() 语句。也就是说,我不用“检查”这些东西。 使用数据库连接,我只会写
using (var conn = new OracleConnection(cnStr))
{
    conn.Open();
    var comm = conn.CreateCommand();
    comm.CommandText = "select * from all_tables where temporary='N'";
    comm.CommandType = System.Data.CommandType.Text;
    result = (from DbDataRecord record in comm.ExecuteReader()     //result 是在Using{ }外部定义的
                let name = (string)record["TABLE_NAME"]
                where name.EndsWith("ak")
                select new MyTableDefine { TableName = name  }).ToList();
}
这种代码。这里用不着写Close()代码,但是可以保证即使是程序异常,那么conn也会及时关闭。 养成另一种书写规范,胜过你去总是一遍遍人工查看“数据库连接都有关闭”![/quote] 谢谢给出的提示,数据库链接的方法是你写的这样.而且也会回收连接数,只是回收的速度远远不及创建的速度.因为有多个站连接这一个数据库,可能是过度的OPEN造成的.查看连接数有很多sleeping
  • 打赏
  • 举报
回复
引用 6 楼 a271083650 的回复:
经过仔细检查,数据库连接都有关闭. 但是,去分离数据库时,看到数据库连接数只增不减. 也就是没有关闭连接, 而,超时一下之后,回收程序池,数据库链接没有减,而网站又可以跑起来
我从来不写 DbConnection.Close() 语句。也就是说,我不用“检查”这些东西。 使用数据库连接,我只会写
using (var conn = new OracleConnection(cnStr))
{
    conn.Open();
    var comm = conn.CreateCommand();
    comm.CommandText = "select * from all_tables where temporary='N'";
    comm.CommandType = System.Data.CommandType.Text;
    result = (from DbDataRecord record in comm.ExecuteReader()     //result 是在Using{ }外部定义的
                let name = (string)record["TABLE_NAME"]
                where name.EndsWith("ak")
                select new MyTableDefine { TableName = name  }).ToList();
}
这种代码。这里用不着写Close()代码,但是可以保证即使是程序异常,那么conn也会及时关闭。 养成另一种书写规范,胜过你去总是一遍遍人工查看“数据库连接都有关闭”!
  • 打赏
  • 举报
回复
不存在“没有关闭”。就算你不写Close()语句,当对象被GC回收时也会执行Dispose()方法,从而间接执行Close()语句。 不是“没有关闭”,而是“没有及时关闭”。这才是问题的根源(基本上90%以上的原因在于此)。 而且如果你在一个查询中有递归、循环等等,其中不小心过度执行了Open,这就不是“没有及时关闭”的问题,而是过度Open的问题了。
by_封爱 2014-11-04
  • 打赏
  • 举报
回复
这个问题是这样的.. 很多人都会说 什么 con没关闭 dr没关闭...实际上不是的.. 就算你都关闭了还是会出现这样的问题.. 我刚毕业的时候 使用大量的datareader(虽然都有close) 但是扔到服务器就有问题 本地就没问题.. 所以找了很多办法居然无解.. 后来无奈的 把所有的datareader都换成了adaper..然后....就可以了.... 不知道LZ是否遇到的问题跟我一样,,
IssacChow 2014-11-04
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
[quote=引用 6 楼 a271083650 的回复:] 经过仔细检查,数据库连接都有关闭. 但是,去分离数据库时,看到数据库连接数只增不减. 也就是没有关闭连接, 而,超时一下之后,回收程序池,数据库链接没有减,而网站又可以跑起来
点引用,不小心点到丢板砖了,居然没有提示,直接就可以点了... 你关闭连接是在哪里关闭的,DAL层吗 不要把数据库连接对象丢给UI层去处理,然后让UI层自己关闭 那样如果数据没处理完就把网页关掉了,不是就不关闭了吗[/quote] 没有在UI层去处理,都是在dbhlper或者DAL层去处理的
於黾 2014-11-04
  • 打赏
  • 举报
回复
引用 6 楼 a271083650 的回复:
经过仔细检查,数据库连接都有关闭. 但是,去分离数据库时,看到数据库连接数只增不减. 也就是没有关闭连接, 而,超时一下之后,回收程序池,数据库链接没有减,而网站又可以跑起来
点引用,不小心点到丢板砖了,居然没有提示,直接就可以点了... 你关闭连接是在哪里关闭的,DAL层吗 不要把数据库连接对象丢给UI层去处理,然后让UI层自己关闭 那样如果数据没处理完就把网页关掉了,不是就不关闭了吗
wangweimutou 2014-11-04
  • 打赏
  • 举报
回复
IssacChow 2014-11-04
  • 打赏
  • 举报
回复
经过仔细检查,数据库连接都有关闭. 但是,去分离数据库时,看到数据库连接数只增不减. 也就是没有关闭连接, 而,超时一下之后,回收程序池,数据库链接没有减,而网站又可以跑起来
wszhoho 2014-11-03
  • 打赏
  • 举报
回复
最大的可能是数据库操作完了没关闭连接。
  • 打赏
  • 举报
回复
你的数据库服务开启了? 要使用 IP访问的话 你打开 tcpc/ip 协议么?
於黾 2014-11-03
  • 打赏
  • 举报
回复
1.同时访问数据库的用户过多 2.访问数据库之后连接没有关闭 高并发情况下,不要使用长连接,访问完数据库立即关闭 尤其不要每次访问数据库都open而不close,那样一下就满了
IssacChow 2014-11-03
  • 打赏
  • 举报
回复
引用 1 楼 beautifullysummer 的回复:
打开数据库报错的,检查下数据库和IIS配置.
具体哪些方面呢 ?
beautifullysummer 2014-11-03
  • 打赏
  • 举报
回复
打开数据库报错的,检查下数据库和IIS配置.

62,054

社区成员

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

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

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

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