recordset/connection的close方法并没有立即释放数据库链接

  asp创建的adodb.connection或者adodb.recordset对象直接打开数据库链接字符串时,当关闭connection或者recordset,创建的数据库链接并没有立即释放,大概经过1分钟左右才会自动释放。这个是有连接池控制,每个链接有一个存活期限,可以通过链接字符串(Connection Lifetime)配置存活期限,如果没有设置过,默认为60秒(asp设置Connection Lifetime好像没用,设置为10s还是60s后才自动释放),当超过存活期限这个连接对象才会自动关闭。

监控mssqlserver2000数据库链接数

set cn=server.CreateObject("adodb.connection")
cn.open "driver={sql server};server=.;uid=xxx;pwd=xxx;database=xxx;Connection Lifetime=10;"
response.Write cn.Execute("select count(*) from [user]")(0)
cn.Close
response.Write "<br>"&now
set cn=nothing

问题  超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。

解决办法 
1. 在代码里面 , 把未关闭的连接关闭 
2. 扩大共享池 , 方法如下 :
  解决方法可以是修改连接池的连接生存期 , 因为默认值是 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 的值,那么连接将从池中被移走。

  问题的原因是与数据库的连接没有显示关闭 , 而等系统自动回收是要时间的 . 解决的方法是改变连接池的大小 . 在连接字符串的后面加上以下代码 Enlist=true;Pooling=true;Max Pool Size=300;Min Pool Size=0;Connection Lifetime=300;user id=sa;packet size=1000 
packet size 
参数取 512  32767 中的任一整数值

相关文章



原创文章,转载请注明出处:recordset/connection的close方法并没有立即释放数据库链接
评论(0)Web开发网
阅读(259)喜欢(0)不喜欢(0)Asp/VBScript