我应该在数据访问层中保留sqlconnection吗?

时间:2008-10-29 15:28:14

标签: .net sql ado.net

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

你做了什么?什么运作良好,效果不佳?

6 个答案:

答案 0 :(得分: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。请参阅第二个包含“连接生命周期”的设置表。

答案 1 :(得分:5)

没有太多开销,因为默认情况下,池存储在连接池中。因此,当您打开连接时,通常您只需从池中获得就绪连接。创建SqlConnections并没有给我带来任何麻烦。

答案 2 :(得分:4)

如果您使用相同的连接字符串,则将汇集连接。只要您需要,就应该打开一个连接。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

Bill Vaughn有很多关于连接池和数据访问的有用文章,包括this one

答案 5 :(得分:0)

多年来,我们让客户端保持与数据库的单一持久连接。问题在于检测到间歇性连接故障并正常重新连接。通常,在尝试使用连接之前,您不会知道连接失败(即发出选择将引发“常规SQL错误”)

我们现在使用一个全局可用的静态类,他的工作是将新的连接交给数据库,当你完成它时,你使用相同的类来摆脱连接。

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

我们这样做是因为当我们连接到数据库时需要进行初始化(我们存储信息是SQL Server的CONTEXT_INFO,并且当我们断开连接时必须清空该信息)< / p>