在我的应用程序中,我每秒都使用相同的sql查询数据库。我需要知道应该采取什么措施。它会不会引起像“The 在从池中获取连接之前经过了超时时间。“或者其他任何类似的?
目前,我每秒都在创建一个新连接,并在使用它之后进行处理。在这种情况下我应该重用连接吗?
什么是最好的方法?
答案 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;
}
唯一可能发生的问题是 - 如果您的硬件不合适,则会降低数据库性能。