Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我应该在数据访问层中保持sqlconnection吗?_.net_Sql_Ado.net - Fatal编程技术网

.net 我应该在数据访问层中保持sqlconnection吗?

.net 我应该在数据访问层中保持sqlconnection吗?,.net,sql,ado.net,.net,Sql,Ado.net,快速打开和关闭sqlconnections似乎需要大量开销。我应该保持一个连接(一个、每个客户机、每个数据库),还是在需要时继续声明一个新的sqlconnection对象,并确保自己完成清理 你做了什么?哪些工作正常,哪些工作不正常?如果您使用的是相同的连接字符串,您的连接将被合并。只要您需要,就应该打开连接。没有太多开销,因为默认设置下,池存储在连接池中。因此,当您打开一个连接时,通常您只需要从池中获得一个就绪的连接。创建SqlConnections并没有给我带来任何麻烦。我也有同样的想法,所

快速打开和关闭sqlconnections似乎需要大量开销。我应该保持一个连接(一个、每个客户机、每个数据库),还是在需要时继续声明一个新的sqlconnection对象,并确保自己完成清理


你做了什么?哪些工作正常,哪些工作不正常?

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

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

我也有同样的想法,所以我在一个紧密的循环中使用了相同的连接,以避免在需要时必须实例化另一个连接。但有时很难跟踪它并进行调试,如果您让一个DataReader断开连接,然后在同一个reader仍处于活动状态时尝试执行另一个DataReader,那么您将遇到异常。因此,我只建议在它像一个紧密循环一样频繁的情况下使用它,否则就不值得麻烦了。

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

如果您使用的是SQL Server:

OLE DB、ODBC、Oracle:

迪诺·埃斯波西托文章:


您可以使用connectionstring名称/值覆盖默认池行为:。请参阅包含“连接生存期”的第二个设置表。

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


Bill Vaughn有许多关于连接池和数据访问的有用文章,包括多年来我们让客户端保持与数据库的单一持久连接。问题在于检测间歇性连接故障并正常重新连接。通常,在尝试使用连接之前,您不会知道连接失败(例如,发出select将抛出“常规SQL错误”)

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

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

我们这样做是因为连接到数据库时需要初始化(我们存储的信息是SQL Server的上下文信息,断开连接时必须清空该信息)

有趣的是,我不知道。池中的连接何时超时?您可以通过connectionstring name/Value:来控制它。向下滚动到包含“连接生存期”的第二个表。