【问题标题】:Web asp.net calling SQL stored procedure creating multiple sessions on SQL Server, occasionally, under heavy activity the web app failsWeb asp.net 调用 SQL 存储过程在 SQL Server 上创建多个会话,偶尔,在繁重的活动下,Web 应用程序会失败
【发布时间】:2019-07-29 15:14:09
【问题描述】:

在大量使用下,网络应用偶尔会失败。发生这种情况时,我得到的唯一错误消息是

存储过程失败

问题在于,它在 80% 到 90% 的时间都可以正常工作,并且只有在网站在几分钟内获得多次点击时才会失败,比如在两分钟的时间间隔内来自六个不同位置的 150 次点击。

我们在 Windows Server 2012 R2 上使用 IIS Manager 6.2 来托管用于从六个 pi 终端收集时间打卡的 Intranet Web 应用程序。该应用是使用 Visual Studio 2017 创建的

Dim sqlConnection1 As New SqlClient.SqlConnection("Data Source=SLDB;Initial Catalog=SyteLine_AWP;Persist Security Info=True;User ID=sa;Password=sqladmin")

Dim cmd As New SqlClient.SqlCommand

Dim parm As New SqlParameter()
Server.ClearError()

Dim ex As Exception = Server.GetLastError

parm.Direction = Data.ParameterDirection.ReturnValue
parm.ParameterName = "ReturnValue"
cmd.Parameters.Add(parm)

cmd.CommandText = "AWP_TimeClock_Web"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = sqlConnection1

cmd.Parameters.AddWithValue("@VAR_badge_num", badgenum)
cmd.Parameters("@VAR_badge_num").Direction = ParameterDirection.Input
cmd.Parameters.AddWithValue("@VAR_term_id", TermID)
cmd.Parameters("@VAR_term_id").Direction = ParameterDirection.Input
cmd.Parameters.Add("@VAR_emp_name", SqlDbType.VarChar, 40).Value = ""
cmd.Parameters("@VAR_emp_name").Direction = ParameterDirection.Output
cmd.Parameters.Add("@VAR_error", SqlDbType.Int, 1).Value = 0
cmd.Parameters("@VAR_error").Direction = ParameterDirection.Output

sqlConnection1.Open()
cmd.ExecuteNonQuery()

正如我之前所说,80% 到 90% 的时间都可以正常工作。在大量使用期间,任何数量的应用程序都会冻结,部分或全部最终会丢失并显示错误消息“存储过程失败”。我怀疑问题不在于存储过程,而在于连接到服务器的能力。虽然目前我无法排除任何可能。

【问题讨论】:

  • 顺便说明一下:SQL Server 2008 和 2008 R2 目前不再提供扩展支持 - red-gate.com/simple-talk/sql/database-administration/… - 是时候升级了!
  • 您是否尝试过将代码包装在try-catch 块中并在遇到此异常时添加一些重试逻辑?
  • mjw - 是的,在存储过程中,但它似乎从未成功过。这就是让我认为它不是存储过程的原因。我确实将 IIS 服务器设置为在站点上创建错误日志,希望我可以获得更多信息。当然今天没有出错。
  • 有关闭sql连接的代码吗?共享的代码似乎没有关闭连接或释放连接对象。
  • 莫汉,我的理解是关闭连接命令是多余的。我已将其注释掉,因为它在激活时会引起另一个问题。

标签: asp.net sql-server-2008


【解决方案1】:

我更改为 ASP.NET VB 代码以包含 Using 和 try/catch 命令。自上线以来,该网络应用程序一直在正常运行。

Dim sqlConnection1 As New SqlClient.SqlConnection("Data Source=SLDB;Initial catalog=SyteLine_AWP;Persist Security Info=True)        
Dim cmd As New SqlClient.SqlCommand
Dim parm As New SqlParameter()

Server.ClearError()

Dim ex As Exception = Server.GetLastError

parm.Direction = Data.ParameterDirection.ReturnValue
parm.ParameterName = "ReturnValue"

cmd.Parameters.Add(parm)
cmd.CommandText = "AWP_TimeClock_Web"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = sqlConnection1

cmd.Parameters.AddWithValue("@VAR_badge_num", badgenum)
cmd.Parameters("@VAR_badge_num").Direction = ParameterDirection.Input

cmd.Parameters.AddWithValue("@VAR_term_id", TermID)
cmd.Parameters("@VAR_term_id").Direction = ParameterDirection.Input

cmd.Parameters.Add("@VAR_emp_name", SqlDbType.VarChar, 40).Value = ""
cmd.Parameters("@VAR_emp_name").Direction = ParameterDirection.Output

cmd.Parameters.Add("@VAR_error", SqlDbType.Int, 1).Value = 0
cmd.Parameters("@VAR_error").Direction = ParameterDirection.Output

Using cmd

    Try

        sqlConnection1.Open()

        cmd.ExecuteNonQuery()

    Catch err As Exception

        error_code = "5"

    End Try

End Using

sqlConnection1.Close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多