8

似乎快速打开和关闭 sqlconnections 涉及很多开销。我应该保持一个连接(一个,每个客户端,每个数据库),还是在需要时继续声明一个新的 sqlconnection 对象,并确保我自己清理干净?

你做了什么?什么效果好,什么效果不好?

4

6 回答 6

22

在大多数情况下,.NET 连接池会为您处理这个问题。即使您通过代码打开和关闭连接,这也不是幕后发生的事情。当您实例化并打开一个连接时,.NET 会在连接池中查找具有相同连接字符串的现有连接,然后将其提供给您。当您关闭连接时,它会返回到连接池以供将来使用。

如果您使用的是 SQL Server:http: //msdn.microsoft.com/en-us/library/8xx3tyca.aspx

OLE DB、ODBC、Oracle:http: //msdn.microsoft.com/en-us/library/ms254502.aspx

Dino Esposito 文章: http: //www.wintellect.com/Articles/ADO%20NET%20Connection.pdf

您可以使用连接字符串名称/值覆盖默认池行为:http: //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx。请参阅包含“连接生命周期”的第二个设置表。

于 2008-10-29T15:40:10.083 回答
5

没有太多开销,因为在默认设置下,池存储在连接池中。因此,当您打开一个连接时,通常您只会从池中获得一个准备好的连接。创建 SqlConnections 并没有给我带来任何麻烦。

于 2008-10-29T15:30:37.310 回答
4

如果您使用相同的连接字符串,您的连接将被合并。只要您需要,您应该只打开一个连接。

于 2008-10-29T15:29:24.207 回答
1

我确实有同样的想法,所以我在一个紧密的循环中使用了相同的连接,以防止在需要时必须实例化另一个连接。但是有时很难跟踪它并进行调试,如果您从连接中获取 DataReader,然后在同一个阅读器仍处于活动状态时尝试执行另一个,那么您将得到异常。所以,我只推荐它,如果它真的像一个紧密的循环一样频繁,否则它不值得麻烦。

于 2008-10-29T15:39:32.440 回答
1

这通常不是一件好事(您可能会导致泄漏并最终耗尽连接),而是依赖连接池来获得性能并根据需要打开连接并尽快关闭连接。

Bill Vaughn 有许多关于连接池和数据访问的有用文章,包括这篇文章

于 2008-10-29T17:22:35.727 回答
0

多年来,我们让客户端保持与数据库的单一持久连接。问题在于检测间歇性连接失败并正常重新连接。很多时候你不会知道连接失败,直到你尝试使用它(即发出一个选择将抛出一个“一般 SQL 错误”)

我们现在使用一个全局可用的静态类,它的工作是为您提供一个到数据库的新连接,当您完成它时,您使用同一个类来摆脱连接。

DbConnection conn = Database.GetConnection();
try
{
   //do stuff with the connetion
   ...
}
finally
{
   Database.DisposeConnection(conn);
}

我们这样做是因为在连接数据库时需要初始化(我们存储的信息是 SQL Server 的 CONTEXT_INFO,并且在断开连接时必须清空该信息

于 2008-10-29T18:05:45.263 回答