【问题标题】:I am continuously querying database; should there be any problem?我不断查询数据库;应该有什么问题吗?
【发布时间】:2011-05-21 12:27:25
【问题描述】:

在我的应用程序中,我每隔一秒就使用相同的 sql 查询数据库。我需要知道我应该采取什么措施。它会不会引起像“ 在从池中获取连接之前已经过了超时时间。”或其他类似的?

目前,我每秒创建一个新连接,并在使用后处理它。在这种情况下我应该重用连接吗?

最好的方法是什么?

【问题讨论】:

  • 您能告诉我们这样做的原因吗?如果您的查询开始执行时间超过 1 秒,您可能会遇到大问题。

标签: c# .net ado.net


【解决方案1】:

恕我直言,最佳做法是尽快抽出连接 - 使用它们来访问您需要的内容并立即关闭它们。您的敌人在性能方面并不是创建连接所需的开销(尽管其中涉及一些) - 它正在锁定数据库中的表。

如果您希望优化您的应用程序,您应该尝试实现某种缓存机制,这样您就不必为每次查找都往返于数据库。这将有利于您的性能。

您可以做的另一件事是尽可能使用只读连接 - 与传统连接相比,它们需要的开销更少,并且还会提高您的性能。

【讨论】:

  • 缓存不是这里的解决方案。它总是在每次旅行中都有新数据。
  • 唯一真正的方法是使用 DataReader - msdn.microsoft.com/en-us/library/aa720705(v=VS.71).aspx - 它是一个只读的、只进的游标,因此它的性能更高。此外,它使用延迟执行,因此如果需要,您可以保持每秒一次访问相同的 DataReader 以从数据库中提取最新数据。
【解决方案2】:

您绝对应该每次都打开和关闭连接。实际上,如果您的using 块在最后一次使用连接后有很多代码,请调用Close() 以尽快将其恢复到池中。这样就减少了不需要打开全新连接的其他用途的机会(请参阅What does "opening a connection" actually mean? 了解更多关于何时打开真正的连接以及何时从池中获取连接)。

这是“每秒一次”的平均值,是跨不同线程的平均值,还是一个线程上的平均值?如果这一切都在一个线程上没关系,实际上保持连接对象打开甚至可能稍微快一些,因为无论哪种方式都不会争用它。

我当然会考虑缓存结果,尽管这在内存使用方面有不利之处,以及关于何时需要刷新缓存结果的潜在复杂问题 - 实际上,这可能是微不足道的,也可能是不可能的,具体取决于您正在做什么。

这显然也是一个查询,在优化时要加倍努力。

【讨论】:

    【解决方案3】:

    为什么需要这样做?

    您可以尝试缓存数据以减少数据库的负载。您需要 1 秒前的数据还是 5 秒后的数据。

    每次使用后关闭连接就可以了。它并没有真正关闭,它只是回到连接池中。

    【讨论】:

    • 缓存不是我的解决方案。每个数据库查询都需要一个新的结果集。
    • 但问题是为什么?可能有人对您的问题有更好的解决方案。
    • 我们的服务器上上传了很多文件,它们的记录保存在数据库中。我们有一项服务,每秒查询数据库以查找新文档,然后根据其元信息处理每个文档(过滤和重命名等)。并在最后更新数据库记录。
    • 用户是不是迫不及待地等不及了,比如30秒后才能使用上传的文档? 1 秒似乎有点过头了。
    【解决方案4】:

    如果您使用的库确实为您汇集了连接,那么它没有任何区别。如果不是,那么最好多次使用相同的连接。创建连接非常耗时。

    几个问题...

    • 您从数据库中获取了哪些数据?
    • 可以将这些数据存储在应用程序内存中吗?

    【讨论】:

      【解决方案5】:

      如果你像这样处理连接,这种方法没有问题:

      using (SqlConnection cnn = new SqlConnection(ConnectionString))
      {
                  SqlCommand cmd = new SqlCommand(commandText, cnn)
                  {
                      CommandType = CommandType.Text
                  };
      
                  DataSet ds = new DataSet();
                  SqlDataAdapter da = new SqlDataAdapter(cmd);
                  da.Fill(ds);
      
                  return ds;
      }
      

      唯一的问题可能会发生 - 如果您的硬件不够好,则会降低您的数据库性能。

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        • 2010-09-07
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多