在不阻塞资源的情况下使用记录集

问题描述

我正在处理旧代码库上的一些性能问题。 问题出现在 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 要求修改此示例。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...