如何解决在不阻塞资源的情况下使用记录集
我正在处理旧代码库上的一些性能问题。
问题出现在 Sql Server 中。查询超时或@Bean
。在进行负载测试时,此错误消息出现的时间比我想象的要早。
代码正在使用此代码执行 vbscript 数据库查询
The request limit for the database is 2000 and has been reached
然后像这样使用它
Dim cmd,i,rsx
Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandText = querytext
' 1 -> adCmdText
cmd.CommandType = 1
For i = 0 To UBound(parameters)
cmd.Parameters.Append(create_variant_input_parameter(cmd,"",parameters(i)))
Next
Set cmd.ActiveConnection = connection
Set rsx = cmd.Execute()
我读到记录集对象保持与服务器的连接,这是否在循环记录集时不必要地阻塞了数据库工作者?这些循环也嵌套了很多次,所以这是一个非常简单的例子。
如果是,我怎样才能将结果保存在不保持连接的记录集中而不必重写整个代码库?
解决方法
尝试在 ADODB.Recordset 中使用“firehose 光标”。
以下是在 VBA 中构建一个的方法:
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseServer
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
End With
这些是服务器端的、只进的、只读的游标,它们将数据直接从服务器推送到客户端记录集,然后您可以循环使用这些游标。获取数据,然后确保关闭记录集以释放服务器上的资源。
值得注意的是,您还可以使用记录集的 CacheSize
来修改性能。
您可以根据您的 VBScript 要求修改此示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。