我一直在查询数据库;应该有什么问题吗?

时间:2010-12-07 10:43:40

标签: c# .net ado.net

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

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

什么是最好的方法?

5 个答案:

答案 0 :(得分:1)

恕我直言最佳做法是尽快抽空和转储连接 - 使用它们来获取所需内容并立即关闭它们。你的敌人在性能方面不是创建连接所需的开销(虽然有一些涉及) - 它正在你的数据库中锁定一个表。

如果您正在寻求优化您的应用程序,您应该尝试实现某种缓存机制,使您不必为每次查找进行数据库往返。这将是您在绩效方面的利益。

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

答案 1 :(得分:1)

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

这是“每秒一次”不同线程的平均值,还是一个线程上的所有线程?如果它只在一个线程上并不重要,实际上它甚至可以稍微更快地保持连接对象打开,因为无论哪种方式都不会争用它。

我肯定会考虑缓存结果,虽然这会降低内存使用的缺点,以及关于何时需要刷新缓存结果的潜在复杂问题 - 实际上这可能是从微不足道到不可能的任何地方,具体取决于您正在做什么。

在优化时,这显然是一个额外的追求。

答案 2 :(得分:0)

为什么需要这样做?

您可以尝试缓存数据以减少数据库的负载。您是否需要1秒钟或5秒钟的数据。

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

答案 3 :(得分:0)

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

一些问题......

  • 您从数据库获得了哪些数据?
  • 该数据是否可以存储在应用程序内存中?

答案 4 :(得分:0)

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

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;
}

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