最近做了一个电影站,(c#.net,sql2000)本地测试没有问题,但上传到服务器后,每当访问的次数略微增加后,别人再访问时,就提示:超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。关于这个问题的可能性,我已经了解了,但实在没有实质性的解决方案,除非一有问题就重启服务器:
1、conn没有即时关闭。或没有彻底的close()
答:conn.close()我是即开即用。后来我也加了conn.disponse();还有dr什么的,也是用玩了,马上dr.close()了,用这个方案,发现用了一段时间,问题照旧2、改变连接池的最大参数,在web.config中设置
答:我已经设置如下:
Enlist=true;Pooling=true;Max Pool Size=512;Min Pool Size=0;Connection Lifetime=300;user id=sa
用了一天,本来以为好了,但今天上午再访问时,问题又出现了。3、sqlserver2000,我已经装了sp4
问题出现后,过段时间,他又会自然的好了,访问能正常了。最奇怪的事,我以前写的程序,有很多代码和现在的这个电影站是一样的,数据库操作方法,类等 ,几乎是一样的,为什么 这样程序上传到服务器后,访问量再大也没事,就我现在的电影有问题???会不会和session有关,我session也不多的,只有一页用了4个左右。实在找不到其他方法了。总不能不断的重启服务器吧,不知为何??请高手为我一绝,送一招终极的方法,磕头谢了!

解决方案 »

  1.   

    还有一个问题,就是,服务器重启后,我发现,这个sqlserv在内存中已经占60M多了。不知为何,很奇怪,重启后,还没有访问,为什么sqlserv就占这么多呢????????同样用asp写的程序,也是sqlserver的,为什么他只占16M内存?????苦闷~~~~~~~~~明天还得继续等 这个问题的解决方案,帮我一把吧,谢谢哦
      

  2.   

    dr.close()关了以后,那个conn是不是默认会关了??也就说 conn.close();这句话就不要再写了???
      

  3.   

    解决方法可以是修改连接池的连接生存期,因为默认值是60秒,即连接从应用程序被释放后可以在池中保存的时间。
    具体操作步骤如下:
    如果是ODBC的话,则可以在ODBC Data Source Administrator中手动更改,该程序位于“Start”菜单中的“Programs”->"Adminstrative Tools"(中文名:管理工具)下,或从"Control Panel"(中文名:控制面板)中打开“ODBC Data Source Administrator”(ODBC数据源管理器),再选择“Connection Pooling”(连接池)选项卡,双击驱动程序中的“SQL Server”,选择“Pool Connetions to this drive”(使用池连接该驱动程序),把下面的时间60秒改的大一点,例如120。
    如果是SqlConnection的共享连接,则为ConnectionString属性Connection Lifetime数值名称指定一个值,该值默认情况下是0,表示连接永远不会从池中被自动移走。如果指定一个不同的值,那么一旦连接被返回到池中,该值将和连接的创建时间及当前时间进行比较。如果生存期超过了Connection Lifetime的值,那么连接将从池中被移走。
      

  4.   

    我把这句话完全给你翻译一下,你仔细想想就明白了..Q:超时时间已到。
    A:这个问题很明显,是因为你池中的连接已经被用完,但是有其他连接正在等待,而被使用的连接的时间大于了你设置的等待超时时间..也就是大于了Connection Lifetime..Q:在从池中获取连接之前超时时间已过。
    A:答案和上面一样..Q:出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。
    A:加大设置你的池中最大连接数..并且仔细检查你的某些数据库操作是否有可能造成关闭超时..比如,某个页面读取数据过多..某个数据显示时间过长...造成关闭的延迟...===========================你如果能看懂上面的问题..应该能找到问题所在了..我的解决方案是:增加连接池最大池大小.增加延迟时间,优化数据读取,对于大数据量读取写入,用存储过程代替..监视数据库连接,找出访问量最大的页面..针对这些做优化..或者生成HTML页面.减少数据库打开关闭次数..