从一台 PC 到另一台 PC 的存储过程调用不一致

Posted

技术标签:

【中文标题】从一台 PC 到另一台 PC 的存储过程调用不一致【英文标题】:Inconsistent Stored Procedure Calls from One PC to Another 【发布时间】:2013-10-02 20:56:31 【问题描述】:

我有一个未绑定的 Access 表单,它使用通过存储过程 GetIssueComponents() 从 SQL Server 2008 检索到的数据填充文本框。下面是这个的代码。该代码有效。我的问题是,某些 PC 会始终执行函数调用并在一秒钟内全部检索数据。但是,其他计算机将需要数十秒才能完成此操作。我们甚至有一台机器需要一两分钟!每台机器所用的时间不同,但每台机器的时间都是一致的。

它似乎与硬件没有任何直接关系,因为许多计算机都是相同的配置,事实上,我们拥有的最差的计算机是执行该过程最快的计算机之一! ODBC 驱动程序在所有计算机上也是相同的。所有的计算机都运行 Windows XP,我相信它们都安装了相同的补丁。不知道在哪里找,请帮忙!

Global adoCnn As New ADODB.Connection

Public Function ADO_ConnectionInitialize() As Boolean
Const DEBUG_THIS_PROC_NAME = "ADO_ConnectionInitialize"
Debug_Proc_Start DEBUG_THIS_PROC_NAME, True
On Error GoTo ADO_ConnectionInitialize_Error

    ADO_ConnectionInitialize = False
    If adoCnn.state = adStateClosed Then
        adoCnn.ConnectionString = "Provider=SQLOLEDB;Data Source=10.10.10.10;Initial Catalog=" & DATABASE_NAME & ";Integrated Security=SSPI;"
        adoCnn.Open
    End If
    ADO_ConnectionInitialize = True

ADO_ConnectionInitialize_Error:
Select Case Debug_Proc_End(DEBUG_THIS_PROC_NAME, True)
    Case vbAbort
        Debug.Assert False
        Resume
    Case vbRetry
        Resume
    Case vbIgnore
        Resume Next
    Case vbCancel
    Case vbOK
    Case Else
End Select
End Function

Public Function ADO_StoredProcedure(ProcName As String, Optional parameters As Variant) As ADODB.parameters

    Dim comm As ADODB.Command
    Dim p As Variant
    Dim param As ADODB.Parameter

    If ADO_ConnectionInitialize() Then
        Set comm = New ADODB.Command
        With comm
            .ActiveConnection = adoCnn
            .CommandType = adCmdStoredProc
            .CommandText = ProcName
            For Each p In parameters
                If IsNull(p(3)) Then
                    Set param = .CreateParameter(p(0), p(1), p(2))
                Else
                    Set param = .CreateParameter(p(0), p(1), p(2), p(3))
                End If
                .parameters.Append param
                If p(2) = adParamInput Or p(2) = adParamInputOutput Then
                    .parameters(p(0)).value = p(4)
                End If
            Next
        End With
        comm.Execute
        Set ADO_StoredProcedure = comm.parameters
        Set comm = Nothing 'Memory leak if this isn't done??
    End If

    End Function


    Public Function GetIssueComponents(ByVal issueID As Long) As String
    Const DEBUG_THIS_PROC_NAME = "GetIssueComponents"
    Debug_Proc_Start DEBUG_THIS_PROC_NAME
    On Error GoTo GetIssueComponents_Error

        Dim params As ADODB.parameters
        Dim p As ADODB.Parameter

        Set params = ADO_StoredProcedure("dbo.GetIssueComponents", Array( _
            Array("@ReturnValue", _
                ADODB.DataTypeEnum.adInteger, _
                ADODB.ParameterDirectionEnum.adParamReturnValue, _
                Null, _
                Null), _
            Array("@issueID", _
                ADODB.DataTypeEnum.adInteger, _
                ADODB.ParameterDirectionEnum.adParamInput, _
                Null, _
                issueID), _
            Array("@Components", _
                ADODB.DataTypeEnum.adVarChar, _
                ADODB.ParameterDirectionEnum.adParamOutput, _
                255, _
                Null) _
        ))
        GetIssueComponents = params("@components").value

    GetIssueComponents_Error:
    Select Case Debug_Proc_End(DEBUG_THIS_PROC_NAME)
        Case vbAbort
            Debug.Assert False
            Resume
        Case vbRetry
            Resume
        Case vbIgnore
            Resume Next
        Case vbCancel
        Case vbOK
        Case Else
    End Select
    End Function

【问题讨论】:

我看不出你的代码有什么问题。我建议在您的连接和/或命令对象上设置短超时,以查看超时是否被触发。您可能应该尝试使用 SQL Server Profiler 来查看其中是否显示了任何锁。如果重新启动服务器或服务器上的 SQL 服务会发生什么?所有机器第一次运行 SP 时都一样慢吗? 服务器已经重新启动了几次(由于其他原因),并且所有涉及的 PC 都经常有自己的重新启动。自从我一个多月前实施代码以来,这种情况一直在发生,所以它似乎并没有转瞬即逝。在服务器上,我在任何时候都只使用一台 PC 进行了测试,所有机器都保持其各自的特征慢或快的过程时间。 你有没有设置断点,逐行遍历代码,以确定哪一步是慢机器上的瓶颈? 在程序ADO_StoredProcedure 上的comm.Execute 是它挂起的地方。该连接是一个 OLE DB,我不小心用 ODBC 标记了它...将修复。 【参考方案1】:

我不知道为什么从一台电脑到另一台电脑的连接性能不同,但我确实发现将 OLE DB 更改为 ODBC 完全消除了这个问题。我的新连接字符串如下:

adoCnn.ConnectionString = "DRIVER=sql server;SERVER=" & DATABASE_IP & ";APP=Microsoft Office 2010;DATABASE=" & DATABASE_NAME & ";Network=DBMSSOCN;Trusted_Connection=Yes"

所以这算是一种变通方法,但我仍然很想听听有关 OLE DB 的详细信息以及为什么它的性能如此不一致。

【讨论】:

以上是关于从一台 PC 到另一台 PC 的存储过程调用不一致的主要内容,如果未能解决你的问题,请参考以下文章

从一台主机到另一台主机的共享库路径不一致

我如何在一台 Linux PC 中使用 Opencv 构建到另一台?

无需重新下载即可将 TFS 工作区移动到另一台 PC

如何将内置的 Cython 扩展从 PC 转移到另一台?

由于 .PFILE 扩展名,无法打开传输到另一台 PC 的 Windows 10 加密文件

将项目从PC迁移到其他PC后,错误在codeigniter中不推荐使用each()函数[重复]