问个C#连接数据库的问题
异常提示:
超时时间已到。但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小请问这是什么原因,我的程序是定时每10秒自动读取数据库,获取数据,然后进行更新。
量有时候大有时候小。。偶尔会提示以上异常,请问是什么原因?我的程序运行的时候,用个datareader逐条获取数据
然后得到的每天数据更新到数据库。
每个步骤新建一个数据库连接进行处理。
请问这是因为什么原因呢?我这是winform程序,每个数据库操作都用using,和try catch ,每个打开的链接都确保关闭了。

解决方案 »

  1.   

    http://blog.csdn.net/lee576/archive/2008/02/24/2116360.aspx
      

  2.   


    配置文件中连接自字串里加上Max   Pool   Size=512;不过你十秒一次是有些不好。。
      

  3.   

    出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。 
    说明: 执行当前 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中加行数,把你要显示的内容放到单元格中,然后再按第二条方式设置后就可以了。
      

  4.   

    DataReader是面向连接的,我遇到的例子有80%就是因为DataReader没有Close()。
      

  5.   

    第一种原因:有可能是连接池中connection已满,每个连接用完后要手动释放,或放回连接池中。不要每次都去new一个新的连接。
    如果你的数据库不在本地还有可能出现第二种原因:数据库服务器关掉了或者网线掉了。