【问题标题】:Code takes time that varies system to system代码需要时间,因系统而异
【发布时间】:2014-11-05 12:01:19
【问题描述】:

过去 15 天我都遇到了问题。我有一个代码,其中包含一个 do-while 循环,其中有 4 个 for 循环。在每个循环中,都会调用以下函数。

Public Function retds1(ByVal SPName As String, ByVal conn As SqlConnection, Optional ByVal ParameterValues() As Object = Nothing) As DataSet
    dconn = New SqlConnection(ConfigurationManager.ConnectionStrings("webriskpro").ConnectionString)
    Try
        sqlcmd = New SqlCommand
        ds = New DataSet
        If dconn.State = ConnectionState.Open Then dconn.Close()
        sqlcmd = New SqlCommand(SPName, dconn)
        sqlcmd.CommandType = CommandType.StoredProcedure
        dconn.Open()
        SqlCommandBuilder.DeriveParameters(sqlcmd)
        If Not ParameterValues Is Nothing Then
            For i As Integer = 1 To ParameterValues.Length
                sqlcmd.Parameters(i).Value = ParameterValues(i - 1)
            Next
        End If
        da = New SqlDataAdapter(sqlcmd)
        da.Fill(ds)
    Catch ex As Exception
        send_prj_err2mail(ex, SPName, "")
    Finally
        dconn.Close()
    End Try
    Return ds
End Function

现在的问题是 1)在我的本地系统中,我得到“超时过期。在操作完成之前超时时间已过或服务器没有响应”错误。所以我将函数更改如下。(即)我添加了 CommandTimeout=0

Public Function retds1(ByVal SPName As String, ByVal conn As SqlConnection, Optional ByVal ParameterValues() As Object = Nothing) As DataSet
    dconn = New SqlConnection(ConfigurationManager.ConnectionStrings("webriskpro").ConnectionString)
    Try
        sqlcmd = New SqlCommand
        ds = New DataSet
        If dconn.State = ConnectionState.Open Then dconn.Close()
        sqlcmd = New SqlCommand(SPName, dconn)
        sqlcmd.CommandType = CommandType.StoredProcedure
        sqlcmd.CommandTimeout = 0
        dconn.Open()
lp:
        SqlCommandBuilder.DeriveParameters(sqlcmd)
        If Not ParameterValues Is Nothing Then
            For i As Integer = 1 To ParameterValues.Length
                sqlcmd.Parameters(i).Value = ParameterValues(i - 1)
            Next
        End If
        da = New SqlDataAdapter(sqlcmd)
        da.SelectCommand.CommandTimeout = 0
        da.Fill(ds)
    Catch ex As Exception
        If ex.Message.ToString.Contains("Timeout expired") Then
            GoTo lp
        End If
        send_prj_err2mail(ex, SPName, "")
    Finally
        dconn.Close()
    End Try
    Return ds
End Function

2) 但发生的情况是“超时已过期”异常仍在发生。抓住它就可以解决问题。但是整个过程需要1个小时。

3) 服务器机器也有同样的问题。所以我们改变了服务器。现在在备份服务器中,整个代码只需要 3 分钟。但是在我的本地机器和主服务器上的相同代码需要 30 多分钟。

添加:

连接字符串

<add name="webriskpro" connectionString="Data Source=TECH01\SQL2005;Initial Catalog=webriskpro1;User ID=sa;Password=#basix123; pooling=false;connection timeout=600;"/>

我有 2 个问题。

  1. 为什么“timeout expired..”只出现在我的本地系统和主服务器机器上,而不出现在备份服务器机器上?

  2. 备份服务器所用的代码只需要 3 分钟。但在我的本地系统和主服务器中,大约需要 30 分钟或更长时间。(都具有相同的源、数据库)。

更新:

我已经在 sql Profiler 中检查了进程。由于循环没有限制,我们不知道它迭代了多少次。对于前几次迭代,持续时间低于 120。然后对于同一个 SP,持续时间为 13000、1200 等。这是什么原因造成的?

以下显示在 sql Profiler 中,即使我在存储过程中设置了 Arithabort

-- network protocol: Named Pipes
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed

谁能告诉我是什么原因?

【问题讨论】:

  • 显示dconnds的声明,它们是共享的吗?
  • 运行相同的存储过程是否总是超时?也许您可以提高数据库性能,而不仅仅是让客户端等待?
  • 但是同样的代码在另一个系统(备份服务器)中只需要 3 分钟。
  • ds 表示数据集@tim
  • @user3651830:我不想知道它是什么,但它是如何声明的以及是否是Shared

标签: asp.net sql-server vb.net command-timeout


【解决方案1】:

我认为您不应该使用 CommandTimeout=0。这将使您的脚本无限期地等待连接成功,即使这永远不会发生。

我建议构建一个重试循环,就像您在第二个解决方案中所做的那样。仅将 CommandTimeout 保持在合理的值。

此外,您应该调查连接失败的原因。也许您的服务器已达到其最大 SQL 连接数?也许您可以在 SQL Server 日志中找到额外有用的信息。

【讨论】:

  • 我的本地系统中只有一个连接。但它给了我例外。我的问题是超时错误出现在我的本地系统和主服务器中。但是对于相同的代码和相同的数据库,为什么它没有进入备份服务器(另一台机器)并且花费的时间只有3分钟。
猜你喜欢
  • 2013-12-31
  • 2018-10-28
  • 2016-07-07
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多