C# 我不断地查询数据库;有什么问题吗?

C# 我不断地查询数据库;有什么问题吗?,c#,.net,ado.net,C#,.net,Ado.net,在我的应用程序中,我每隔一秒钟用相同的sql查询数据库。我需要知道我应该采取什么措施。它会不会引起像“问题”这样的问题 在从池中获取连接之前,超时时间已过。”或者类似的情况 目前,我正在每秒创建一个新连接,并在使用后处理它。在这种情况下,我应该重用连接吗 最好的方法是什么?为什么需要这样做 您可以尝试缓存数据以减少数据库的负载。您需要1秒旧的数据,还是5秒就可以了 每次使用后关闭连接即可。它并没有真正关闭,只是返回到连接池中。我的最佳做法是尽快泵送和转储连接-使用它们访问您需要的内容并立即关闭它

在我的应用程序中,我每隔一秒钟用相同的sql查询数据库。我需要知道我应该采取什么措施。它会不会引起像“问题”这样的问题 在从池中获取连接之前,超时时间已过。”或者类似的情况

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


最好的方法是什么?

为什么需要这样做

您可以尝试缓存数据以减少数据库的负载。您需要1秒旧的数据,还是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;
}

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

每次都应该打开和关闭连接。实际上,如果上次使用连接后,
using
块有很多代码,请调用
Close()
,尽快将其返回池中。这样就减少了不需要打开全新连接的另一次使用的机会(有关何时打开真正的连接以及何时从池中取出一个连接的更多信息,请参阅)

“每秒一次”是不同线程的平均值,还是一个线程上的所有线程的平均值?如果它都在一个线程上,那也没关系,事实上,保持连接对象打开的速度可能会稍微快一点,因为无论哪种方式都不会有争用

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


显然,在优化时,这也是一个额外的问题。

您能告诉我们这样做的原因吗?如果您的查询开始执行时间超过1秒,您可能会遇到大问题。缓存不是解决方案。每次旅行都会有一个新的数据。唯一真正的方法是使用数据阅读器——它是一个只读的、只向前移动的游标,所以它的性能要高得多。此外,它使用延迟执行,因此如果需要,您可以每秒点击同一个DataReader一次,以从数据库中提取最新数据。每个数据库查询都需要一个新的结果集,但问题是为什么?可能有人对您的问题有更好的解决方案。我们的服务器上上载了大量文档,它们的记录保存在数据库中。我们有一项服务,每秒查询数据库以查找新文档,然后根据其元信息处理每个文档(过滤和重命名等)。并在最后更新数据库记录。用户是否迫不及待地等不及,例如,30秒后才能使用上载的文档?1秒钟似乎有点过分了。