记录集使用
请认为一个网站已分钟。每天有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
从技术上讲,你应该尽快销毁对象。
话虽这么说,我做我的大部分网页为你做的,从未有过任何问题
一般而言,手动删除记录集和其他对象过于谨慎,尤其是在页面的末尾。
VBScript内置垃圾回收和终结器。只要一个对象不再被引用*,它就会被GC'd调用并调用它的class_terminate
方法。因此,如果你在一个函数内部创建一个记录集,并且不会将该引用传递给该函数外部,那么当该函数不再被引用时,它将被收集并在函数结束时释放它的资源。如果将对象放置在全局变量中,那么在脚本运行完成后仍然会收集该对象。你不能以这种方式造成内存泄漏。出于这个原因,在脚本末尾设置未设置的对象是无用的,因为它们无论如何都不会在剧本结束后继续存在,除非您故意将它们放入较长寿命的集合中,例如Session
或Application
。 * VBScript的垃圾收集保证提示收集,但由于它只计算引用,它可以被循环引用愚弄。记住这一点,它不应该给你带来麻烦。
通常,如果有短时间需要的对象,在函数局部变量中引用它或作为with块的主题是最佳解决方案。手动取消设置对象的唯一原因是,如果a)您有真正的,需要释放资源的需求,并且b1)所需对象在全局范围内被引用,或者b2)对象是循环参考。
现在,在您的具体情况下,它看起来像唯一值得担心的资源就是数据库连接。如果您的数据库无法跟上负载,则立即终止连接可能会有所帮助。有两种方法可以做到这一点。首先,在不再需要每个记录集时手动取消设置,或者手动取消设置每个记录集的连接。其次,在较小范围内使用记录集或连接,以便自动处理它们。例如,如果您只需要数据,那么您可以使用GetRows
方法来获取数据,而无需保留记录集的开销。在我的代码中,我从不直接使用记录集,命令或连接,而是使用帮助函数来处理大量的ADO细节并返回我想要的实际数据。
非常感谢。我是否真的必须使用readonly而不是读/写?虽然我不需要更新,但我使用1,3作为游标 – moreless 2011-02-22 18:58:51