请想一个有分钟的网站。每日30.000名访客 该站点使用sql 2008
进行编码有太多行和很多数据库连接
我使用跟随
的记录集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
我的意思是我应该在需要的时候创建对象并在每次完成时使用它来杀死它
答案 0 :(得分:3)
如果您将记录集创建为与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
答案 1 :(得分:3)
一般来说,手动删除记录集和其他对象是非常谨慎的,尤其是在页面末尾。
VBScript具有内置的垃圾收集和终结器。一旦对象不再被引用*,它将被GC'd并且其class_terminate
方法被调用。因此,如果在函数内部创建记录集并且不在函数外部传递引用,那么它将被收集,并且在函数结束时不再引用它时释放其资源。如果将对象放在全局变量中,则在脚本运行完毕后仍将收集该对象。您不能以这种方式导致内存泄漏。出于这个原因,脚本末尾的未设置对象是无用的,因为它们无论如何都无法在脚本结束时存活,除非您故意将它们放在更长寿的集合中,例如Session
或Application
* VBScript的垃圾收集保证了快速收集,但由于它只计算引用,因此它可能被循环引用所欺骗。记住这一点,它不会给你带来任何麻烦。
通常,如果您需要的对象时间很短,则在函数局部变量中引用它或作为with块的主题是最佳解决方案。手动取消设置对象的唯一原因是:a)你有一个真实的,已经证明需要释放资源,并且b1)有问题的对象在需要之后很久就被引用到全局范围或者b2)对象是一部分循环参考。
现在,在您的特定情况下,看起来唯一值得担心的资源是数据库连接。如果您的数据库无法跟上负载,那么立即终止连接可能会有所帮助。有两种方法可以做到这一点。首先,在不再需要时手动取消设置每个记录集,或手动取消设置每个记录集的连接。其次,在较小的范围内使用记录集或连接,以便自动处理它们。例如,如果您只需要数据,则可以使用GetRows
方法获取数据,而无需保留记录集。在我的代码中,我从不直接使用记录集,命令或连接,而是使用辅助函数来处理血腥的ADO细节并返回我想要的实际数据。
答案 2 :(得分:0)
从技术上讲,你应该尽快销毁物品。
话虽这么说,我像你一样做了我的大部分页面并且从未遇到过任何问题