问题描述
我正在处理旧代码库上的一些性能问题。
问题出现在 sql Server 中。查询超时或@Bean
。在进行负载测试时,此错误消息出现的时间比我想象的要早。
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 要求修改此示例。