似乎快速打开和关闭 sqlconnections 涉及很多开销。我应该保持一个连接(一个,每个客户端,每个数据库),还是在需要时继续声明一个新的 sqlconnection 对象,并确保我自己清理干净?
你做了什么?什么效果好,什么效果不好?
在大多数情况下,.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。请参阅包含“连接生命周期”的第二个设置表。
没有太多开销,因为在默认设置下,池存储在连接池中。因此,当您打开一个连接时,通常您只会从池中获得一个准备好的连接。创建 SqlConnections 并没有给我带来任何麻烦。
如果您使用相同的连接字符串,您的连接将被合并。只要您需要,您应该只打开一个连接。
我确实有同样的想法,所以我在一个紧密的循环中使用了相同的连接,以防止在需要时必须实例化另一个连接。但是有时很难跟踪它并进行调试,如果您从连接中获取 DataReader,然后在同一个阅读器仍处于活动状态时尝试执行另一个,那么您将得到异常。所以,我只推荐它,如果它真的像一个紧密的循环一样频繁,否则它不值得麻烦。
这通常不是一件好事(您可能会导致泄漏并最终耗尽连接),而是依赖连接池来获得性能并根据需要打开连接并尽快关闭连接。
Bill Vaughn 有许多关于连接池和数据访问的有用文章,包括这篇文章
多年来,我们让客户端保持与数据库的单一持久连接。问题在于检测间歇性连接失败并正常重新连接。很多时候你不会知道连接失败,直到你尝试使用它(即发出一个选择将抛出一个“一般 SQL 错误”)
我们现在使用一个全局可用的静态类,它的工作是为您提供一个到数据库的新连接,当您完成它时,您使用同一个类来摆脱连接。
DbConnection conn = Database.GetConnection();
try
{
//do stuff with the connetion
...
}
finally
{
Database.DisposeConnection(conn);
}
我们这样做是因为在连接数据库时需要初始化(我们存储的信息是 SQL Server 的 CONTEXT_INFO,并且在断开连接时必须清空该信息)