【问题标题】:VB.net Windows service response timeVB.net Windows 服务响应时间
【发布时间】:2009-08-31 12:24:46
【问题描述】:

我有一个使用无限循环和 thread.sleep 的 Windows 服务。线程的休眠时间为 10 秒。

当服务最初启动并且有工作要做(数据存在于 SQL 中)时,它会立即执行它的进程。 只要有工作要做,它就会继续响应并每 10 秒处理一次任务。如果 SQL 中长时间没有数据(即 15-20 分钟),则服务开始响应非常缓慢。它最终会提取数据并对其进行处理,但这需要 10 分钟而不是 10 秒。

代码中没有逻辑告诉服务休眠。有什么想法吗?

【问题讨论】:

  • 是否有机会发布代码 sn-p 以便我们了解发生了什么?

标签: windows vb.net service


【解决方案1】:

没有看到你的代码,就不可能给出明确的答案; 可能是您没有足够快地整理数据库连接。

如果你有类似的情况:

   While( True )
      Dim con as new SqlConnection(connectionString)
      con.Open()

      Dim cmd as New SqlCommand("usp_getJob", con)
      cmd.CommandType = CommandType.StoredProcedure

      Dim dr as SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult Or CommandBehavior.SingleRow Or CommandBehavior.CloseConnection)
      If( dr.Read() )
          DoSomething(dr)
      Else
          Thread.Sleep(10)
      End If
   End While

...那么它打开连接的速度会比它们自行消失的速度更快。

有几种替代方法,我建议使用Using 块来让连接尽快返回到连接池:

   While( True )
      Using con as new SqlConnection(connectionString)
          con.Open()

          Using cmd as New SqlCommand("usp_getJob", con)
            cmd.CommandType = CommandType.StoredProcedure

            Using dr as SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult Or CommandBehavior.SingleRow Or CommandBehavior.CloseConnection)
                If( dr.Read() )
                    DoSomething(dr)
                    dr.Close()
                Else
                    Thread.Sleep(10)
                End If
             End Using
          End Using
      End Using
   End While

然后这些将在 SqlDataReaderSqlConnectionSqlCommand 上调用 Dispose() - 前两个中的任何一个都会导致连接被释放到连接池(假设我们已经询问了 SqlDataReader CloseConnection 关闭)

【讨论】:

    【解决方案2】:

    完全同意罗兰的观点。如果没有看到代码,很难确定,但最有可能的罪魁祸首是您的数据库代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2019-11-12
      • 2017-01-06
      • 2011-10-20
      相关资源
      最近更新 更多