【发布时间】:2011-05-21 12:27:25
【问题描述】:
在我的应用程序中,我每隔一秒就使用相同的 sql 查询数据库。我需要知道我应该采取什么措施。它会不会引起像“ 在从池中获取连接之前已经过了超时时间。”或其他类似的?
目前,我每秒创建一个新连接,并在使用后处理它。在这种情况下我应该重用连接吗?
最好的方法是什么?
【问题讨论】:
-
您能告诉我们这样做的原因吗?如果您的查询开始执行时间超过 1 秒,您可能会遇到大问题。
在我的应用程序中,我每隔一秒就使用相同的 sql 查询数据库。我需要知道我应该采取什么措施。它会不会引起像“ 在从池中获取连接之前已经过了超时时间。”或其他类似的?
目前,我每秒创建一个新连接,并在使用后处理它。在这种情况下我应该重用连接吗?
最好的方法是什么?
【问题讨论】:
恕我直言,最佳做法是尽快抽出连接 - 使用它们来访问您需要的内容并立即关闭它们。您的敌人在性能方面并不是创建连接所需的开销(尽管其中涉及一些) - 它正在锁定数据库中的表。
如果您希望优化您的应用程序,您应该尝试实现某种缓存机制,这样您就不必为每次查找都往返于数据库。这将有利于您的性能。
您可以做的另一件事是尽可能使用只读连接 - 与传统连接相比,它们需要的开销更少,并且还会提高您的性能。
【讨论】:
您绝对应该每次都打开和关闭连接。实际上,如果您的using 块在最后一次使用连接后有很多代码,请调用Close() 以尽快将其恢复到池中。这样就减少了不需要打开全新连接的其他用途的机会(请参阅What does "opening a connection" actually mean? 了解更多关于何时打开真正的连接以及何时从池中获取连接)。
这是“每秒一次”的平均值,是跨不同线程的平均值,还是一个线程上的平均值?如果这一切都在一个线程上没关系,实际上保持连接对象打开甚至可能稍微快一些,因为无论哪种方式都不会争用它。
我当然会考虑缓存结果,尽管这在内存使用方面有不利之处,以及关于何时需要刷新缓存结果的潜在复杂问题 - 实际上,这可能是微不足道的,也可能是不可能的,具体取决于您正在做什么。
这显然也是一个查询,在优化时要加倍努力。
【讨论】:
为什么需要这样做?
您可以尝试缓存数据以减少数据库的负载。您需要 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;
}
唯一的问题可能会发生 - 如果您的硬件不够好,则会降低您的数据库性能。
【讨论】: