[C#]超时时间已到,但是尚未从池中获取连接

“/ASP.Web”应用程序中的服务器错误。
——————————————————————————–

超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

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

这是个老问题了!你就查两点: 
  一、看所有open的连接是否都close了。 
  二、如果访问量很大,加上Max   Pool   Size=512这一句,当然这是要以损失系统性能为代价的! 
  这样以后一定可以解决你的问题!

  解决方案一

我 想原因可能是并发操作。DataReader是独占连接的,就是说你的程序可能设计上有问题。比如说最大连接设100,假设有100个人同时使用 DataReader正在读取数据库内容,那么当第101人读取的时候,连接池中的连接已经没有了,就会出现上面的错误。DataReader是独占连接 的,每个DataReader都要占用一个连接。当然这个情况是偶尔出现的,所以会很长时间出现一次,因为只有同时有超过连接池最大连接数量的并发操作才 会发生。而且你加大并发数量只能暂时缓解问题,如果你加大到200个并发连接,如果有201 人同时操作怎么办?你说了你使用Connection对象的Close()方法,这是不行的,因为Close()方法仅仅是关闭连接,但这个连接没有释 放,还是被这个对象占用,要释放必须使用Connection的Dispose()方法显式释放连接才可以,否则这个对象占用的连接只能等到垃圾收集的情 况下才能被释放。这种情况肯定会出现“超时时间已到”的错误。

解决方法:
         1 修改几个关键页面或访问比较频繁的数据库访问操作,使用DataAdapter和DataSet来获取数据库数据,不要使用DataReader。
         2 在访问数据库的页面上使用数据缓存,如果页面的数据不是经常更新(几分钟更新一次)的话,使用Cache对象可以不用访问数据库而使用缓存中的内容,那么可以大大减少连接数量。
         3 修改代码,把使用Connection对象的地方都在Close()后面加上Dispose()调用。
         4 建议对数据库操作进行大的修改,建立自己的数据库操作代理类,继承System.IDisposable接口,强迫释放资源,这样就不会出现连接数量不够的问题了。

解决方案二

解决方法(*):WEB.config 里面:在数据库连接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;">一劳永逸。

解决方案三

估计是连接(Connection)对象没有Close。倒是不必Dispose,而DataReader用完后应该关闭,但不关闭也没问题,只是不关闭的话此连接对象就一直不能用,只要你最终关闭了连接对象就不会出问题。  
   
   连接对象在Open后的操作都放在try块中,后面跟一个finally块:conn.Close();

错误:   3154一般是由于恢复数据库备份时指定的数据库名和原有数据库中数据库相同引起的 
  你指定一个不易重复的名字, 
  或者在恢复时指定选项:覆盖现存数据库 
  
   本人在将SQL2000数据库导入SQL2005出错,错误信息如下:

还原 对于 服务器“EDWARD\\TRACY”失败。 (Microsoft.SQLServer.Smo)

有关帮助信息,请单击: http://go.microsoft.com/fwlink?Prod…er&LinkId=20476

——————————
其他信息:

执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SQLServer.ConnectionInfo)

——————————

备份集中的数据库备份与现有的 \'foodgood\' 数据库不同。
RESTORE DATABASE 正在异常终止。 (Microsoft SQL Server,错误: 3154)

今天我准备把sql2000 的备份数据库 sp.bak 还原在sql2005 上 (因为课堂上用的是sql2000 而我自己电脑里装的是sql2005 )遇到了点麻烦。就是象sql2000 一样操作还原时出现了点问题。说不能还原,最后找到了点方法终于搞定。

1,在sql2005上新建一个数据库比如:商品

2,选择要还原的 sql2000备份文件

3,这里很重要,选中“覆…”看图

sql2000 备份的数据库还原到sql2005后,选择“数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先使用“数 据库属性”对话框的“文件”页或  Alter  AUTHORIZATION  语句将数据库所有者设置为有效登录名,然后再添加数据库关系图支持对象。 
    
解决方法如下:
1、设置兼容级别为90(2005为90)
USE  [master]
GO
EXEC  dbo.sp_dbcmptlevel  at dbname='数据库名',  @new_cmptlevel=90
GO  

或是选责你还原的数据库,点右键,选属性->选项->兼容级别,选择SQLServer2005(90) 然后确定,

      这时,你在该数据库下展开“数据库关系图”节点时会有个提示,"此数据库缺少一个或多个使用数据库关系图所需的支持对象,是否创建",选择“是”即可。

2、通过以上的方法操作,如果问题依然存在的话,按下列方法继续

选择你的数据库,然后选择"安全性"->"用户",选择dbo,打开属性页,如登录名为空的话,新建查询,然后

use [你的数据库名]
EXEC   sp_changedbowner   'sa'

执行成功后,你再选择"数据库关系图"节点,时提示 “此数据库缺少一个或多个使用数据库关系图所需的支持对象,是否创建",选择“是”即可。 就可以看到原先建的关系图了。

1、 对Table中的详细内容,以不同的颜色间隔开相邻的两行。

A:选择Table的Detail行,选择属性中的BackgroundColor,值选择表达式,输入:=iif(RowNumber(Nothing) Mod 2, "White", "Beige")。

2、设置每面显示Table表头或表尾

A:选择Table Header或Table Footer,将属性中的RepeatOnNewpage设为True dot

3、在每页都显示放入的图片或标题头等信息。

A:只须在Table Header中加行数,把你要显示的内容放到单元格中,然后再按第二条方式设置后就可以了。

 

程序功能是一次性生成要求数量的主条码,然后打印出来
我的做法是一次性把生成的代码全部放到一个arraylist里面,让后打印的时候再通过循环一个一个的从arraylist里面取出来打印,然后就导致了以下的错误.
错误如下:
有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。
************** 异常文本 **************
System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
在 System.Data.SqlClient.SqlConnection.Open()
在 UseDB.myDB.ExecuteStoreProcedure(String ProcedureName, SqlParameter[] Parameter)
在 Barcode_Print.DataManipulate.UpdateTwoTable(String Dy_codeTail)
在 Barcode_Print.DataManipulate.MakeBarcode(String quantity)
在 Barcode_Print.FrmBarcode.button1_Click(Object sender, EventArgs e)

字串9

在 System.Windows.Forms.Control.OnClick(EventArgs e)
在 System.Windows.Forms.Button.OnClick(EventArgs e)
在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
在 System.Windows.Forms.Control.WndProc(Message& m)
在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
在 System.Windows.Forms.Button.WndProc(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
连接对象没有及时关闭
我都检查过了,好像没有这样的错误阿
注意每次与数据库交换数据前再定义并打开连接,完后立即关闭.Close()(不要调用Dispose),把连接释放到连接池
不要定义全局型(比如类成员)连接变量
注意用try catch块而且连接关闭一定要放在finally块里面

字串1

和你的条码打印队列没什么关系,和其间或其外使用的数据库连接获取与释放有关系,因为很显然,连接耗尽了。连接应该准备工作完成马上就要提交数据或请求了再申请,用完了立即释放,越早越好。
为什么不能调用dispose?我都是close和dispose一起用的,like this:
conn.close();
conn.dispose();
这个是国外的一个re,但是好像持的是相反的观点
This can lead to heated debate, hopefully I'll answer first and then you can
ignore everyone else
Seriously though, this is what Dispose does (actual code):
switch (this._objectState)
{
case ConnectionState.Open:
{
this.Close();
break;
}
}
this._constr = null;
as you can see, all it does it call Close(). So you might be tempted to say
"i should just call close and save some stack". However, there is a dipose
pattern which you should follow. while you can call one, or the other or
both to achieve the same result, this behaviour could change with future
release. One day (for example 2.0) Dispose might do more…and then you'd

字串8

have to go through all your code and make sure you had called Dispose.
Additionally, languages like C# are dispose-aware thanks to the using
keyword.
As far as i'm concerned, those two points are enough to make sure I always
call Dipose on classes which inherit IDisposable.
As for close, my personal feeling is that it doesn't need to be called if
you are calling Dispose. And, since it's better to be consistent, I'd say
never call it. Why? well, none of the .net language are close-aware, and by
definition of what Dispose does, it would be a mistake from the class
designer (ie, microsoft) to implement cleanup functionality in close which
Dispose also woudlnt' do (possibly simply by running close, as it currently
does).
Karl
另外这一句怎么解释呢?
"注意用try catch块而且连接关闭一定要放在finally块里面"
正如viena(维也纳nn)所说的每次完成都要调用Close(), SqlConnection连接对象会回到连接池中,SqlClient使用的是内部连接机制,类似COM 对象池.这里需要注意的是连接池的参数配置,涉及到连接池的设计. 字串2
Connection Lifetime 设置连接的销毁时间
Max Pool Size 最大连接数
Min Pool Size 最小连接数
如果涉及到事务性处理,连接池的设计也不同.
我刚才查了一下关于connection pool的资料(虽然大部分都是java的)
知道为什么上面有朋友说不要用dispose了
因为close()只是释放连接让这个sqlconnection回到pool中,但是如果是dispose()的话可能pool都被释放掉了么??
Dispose不是释放pool,是释放连接
/*
另外这一句怎么解释呢?
"注意用try catch块而且连接关闭一定要放在finally块里面
*/
考虑数据库操作发生异常的情况:
1 没有异常处理,直接弹出错误对话框,程序终止,连接没有关闭
2 有异常处理,必须在程序运行的每个可能分支最后加连接关闭,否则连接可能没有关闭
如果放在finally块里面,不论是否发生异常,都会执行~

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏