使用Server.CreateObject(“ADODB.Connection”)在Classic ASP中连接泄漏

时间:2011-10-25 21:41:18

标签: sql sql-server asp-classic iis-7.5

我正在查看现有的经典asp应用程序。设置如下:

  • db.asp:使用Server.CreateObject(“ADODB.Connection”)打开连接,然后调用conn.open
  • func.asp:使用db.asp中的conn对象执行查询的辅助方法
  • index.asp:构建查询并调用func.asp中的方法

index.asp和func.asp都包含db.asp。 index.asp包括func.asp否调用conn.close在哪里。

  1. 请求结束时,连接会自动关闭还是恢复?
  2. 当index.asp包含func.asp时,index.asp和func.asp包含db.asp会有什么影响?多个连接?
  3. 是否有任何计数器来检查正在建立的连接数?
  4. 我已经使用过sp_who2,但即使在不同的浏览器下运行,也只能看到应用程序的1条记录。在连接字符串中使用集成安全性和sql帐户尝试了这一点。

    我查看了性能计数器,但数字从未改变。它们保持在5. MSSQL $ Instance:General Statistics \ Logical Connections and MSSQL $ Instance:General Statistics \ User connections。

    我们在应用程序中看到多达47个连接,但我无法在本地重现它。连接被列为休眠,而不是执行。

    在IIS 7.5下运行经典asp

1 个答案:

答案 0 :(得分:3)

  1. 不,连接保持打开状态,但数据库驱动程序最终会将其终止。这需要几分钟,因此如果您有大量访问者,您可以轻松达到并发连接数的数据库限制。
  2. 是的,如果您有多个包含打开连接的代码,则最终会有多个连接。如果连接存储在同一个变量中,则对前一个连接的引用将丢失,只是等待超时。
  3. 您可以在SQL Manager中查看数据库会话。但是,您不会轻易看到返回池的连接与等待超时的孤立连接之间的区别。
  4. 您应确保关闭并取消引用每个连接和每个记录集。例如:

    rstData.Close
    Set rstData = Nothing
    
    conn.Close
    Set conn = Nothing