记录集使用

记录集使用

问题描述:

请认为一个网站已分钟。每天有30,000名游客。
该网站是使用SQL 2008年ASP编码记录集使用

有这么多的线路和这么多的数据库连接

我使用记录像下面

set rs=server.createobject....... 
set rs2=server.createobject....... 
set rs3=server.createobject....... 

我把这些线在的顶部页。 然后我在需要时使用它们;

rs.open "select........." 
rs.close 

我使用它们可能每页3次。

,并在页面的底部我写

set rs=nothing 
set rs2=nothing 
set rs3=nothing 

现在我的问题是:不会造成内存泄漏或其他问题?

或者我应该使用像

set rs=server.createobject 
rs.open 
rs.close 
set rs=nothing 

我的意思是我应该创建对象每当我需要并杀死它,当我用它完成每次

如果创建从DB断开的记录集(释放连接)

Dim rs, cmd 
Set rs = server.createobject("ADODB.Recordset") 
Set cmd = server.createobject("ADODB.Command") 

' Init the ADO objects & the stored proc parameters 
cmd.ActiveConnection = GetConnectionString() 
cmd.CommandText = sqlstmt 
cmd.CommandType = adCmdText 

' Execute the query for readonly 
rs.CursorLocation = adUseClient 
rs.Open cmd, , adOpenForwardOnly, adLockReadOnly 


' Disconnect the recordset 
Set cmd.ActiveConnection = Nothing 
Set cmd = Nothing 
Set rs.ActiveConnection = Nothing 
+0

非常感谢。我是否真的必须使用readonly而不是读/写?虽然我不需要更新,但我使用1,3作为游标 – moreless 2011-02-22 18:58:51

从技术上讲,你应该尽快销毁对象。

话虽这么说,我做我的大部分网页为你做的,从未有过任何问题

这是更好

一般而言,手动删除记录集和其他对象过于谨慎,尤其是在页面的末尾。

VBScript内置垃圾回收和终结器。只要一个对象不再被引用*,它就会被GC'd调用并调用它的class_terminate方法。因此,如果你在一个函数内部创建一个记录集,并且不会将该引用传递给该函数外部,那么当该函数不再被引用时,它将被收集并在函数结束时释放它的资源。如果将对象放置在全局变量中,那么在脚本运行完成后仍然会收集该对象。你不能以这种方式造成内存泄漏。出于这个原因,在脚本末尾设置未设置的对象是无用的,因为它们无论如何都不会在剧本结束后继续存在,除非您故意将它们放入较长寿命的集合中,例如SessionApplication。 * VBScript的垃圾收集保证提示收集,但由于它只计算引用,它可以被循环引用愚弄。记住这一点,它不应该给你带来麻烦。

通常,如果有短时间需要的对象,在函数局部变量中引用它或作为with块的主题是最佳解决方案。手动取消设置对象的唯一原因是,如果a)您有真正的,需要释放资源的需求,并且b1)所需对象在全局范围内被引用,或者b2)对象是循环参考。

现在,在您的具体情况下,它看起来像唯一值得担心的资源就是数据库连接。如果您的数据库无法跟上负载,则立即终止连接可能会有所帮助。有两种方法可以做到这一点。首先,在不再需要每个记录集时手动取消设置,或者手动取消设置每个记录集的连接。其次,在较小范围内使用记录集或连接,以便自动处理它们。例如,如果您只需要数据,那么您可以使用GetRows方法来获取数据,而无需保留记录集的开销。在我的代码中,我从不直接使用记录集,命令或连接,而是使用帮助函数来处理大量的ADO细节并返回我想要的实际数据。