Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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
C# 打开和关闭数据库连接的最佳时间是什么?_C# - Fatal编程技术网

C# 打开和关闭数据库连接的最佳时间是什么?

C# 打开和关闭数据库连接的最佳时间是什么?,c#,C#,每个连接都需要打开和关闭。但是什么时候是最好的,或者取决于具体情况 启动windowsWPF、formWindows窗体、webpageASP.NET时打开连接,用户关闭窗口/窗体/网页时关闭连接。 仅当用户调用数据库时打开连接。例如,用户单击Add按钮,我们运行SQL插入。。。然后尽快关闭连接。然后,如果用户再次单击添加/编辑,我们必须重新连接到数据库,运行SQL并尽快再次关闭它? 两种解决方案都有各自的优势。通过保持连接,我们将提高程序的性能。保持连接和断开连接,性能会下降。最好有一个单独的

每个连接都需要打开和关闭。但是什么时候是最好的,或者取决于具体情况

启动windowsWPF、formWindows窗体、webpageASP.NET时打开连接,用户关闭窗口/窗体/网页时关闭连接。 仅当用户调用数据库时打开连接。例如,用户单击Add按钮,我们运行SQL插入。。。然后尽快关闭连接。然后,如果用户再次单击添加/编辑,我们必须重新连接到数据库,运行SQL并尽快再次关闭它?
两种解决方案都有各自的优势。通过保持连接,我们将提高程序的性能。保持连接和断开连接,性能会下降。

最好有一个单独的项目,我们称之为数据层。该项目可以为不同的模块提供不同的文件,也可以根据需要将所有文件合并到一个文件中。数据库层将公开各种方法,如insert、update、get、delete等。最好只为特定的方法调用打开连接,并在得到结果后立即关闭连接。可以使用“使用”块,如:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();   
    //your code here insert/update/get/delete     
}

当控件脱离使用块时,连接将自动断开。

打开连接,执行插入、更新或删除等操作,并在收到响应后关闭连接


对每个任务打开和关闭连接在任何情况下都不要保持连接打开

通常绑定到工作单元模式,为传入请求创建连接,然后在处理请求时关闭连接 当您有长时间运行的后台任务时,可能会出现偏差 WPF/窗口窗体

在这种情况下,我建议它更多地基于每个操作,即使在轮询更改时也是如此——如果这种情况存在的话 打开、查询、关闭、重复
正确的答案是将它们包装在一个用于查询或要将其用于的查询中。不要将连接保持得太久,而不是立即需要。这样做会产生更多的问题,而不是它的价值

本质上,如果您需要一组查询的连接,只需将它们包装在using语句中,如果它们被长时间运行的任务分隔开,则关闭它们并逐个打开它们。你能做的最糟糕的事情就是试着打开它们,检查它们是否还活着

实际上,大多数应用程序只使用一种或几种不同的方法 连接的配置。这意味着在应用过程中 执行时,许多相同的连接将被重复打开和关闭 关闭为了最小化打开连接的成本,ADO.NET使用 称为连接池的优化技术

此外

连接池减少了创建新连接的次数 必须打开。池方保留物理层的所有权 联系它通过保持一组活动的连接处于活动状态来管理连接 每个给定连接配置的连接。每当用户 调用打开连接时,池处理程序将查找可用的 池中的连接。如果池连接可用,它将 将其返回给调用方,而不是打开新连接。当 应用程序在连接上调用Close,池程序将其返回给 活动连接的池集,而不是关闭它。一旦 连接返回到池中,即可在 下一个开放电话

在下面的示例中,创建了三个新的SqlConnection对象,但只需要两个连接池来管理它们

来自MSDN的示例


对于控制器、WCF服务和CQR,它们通常是短期的,因此在作用域生命周期中注入它们是非常常见的。然而,对于用户应用程序中的按钮单击、服务模式调用等,只要在需要时使用它们即可。永远不要尝试缓存或池。

完成后立即将其关闭,其他用户可能也想访问它查找连接池。对此没有单一的答案。这在很大程度上取决于上下文。请注意,打开/关闭网页并没有真正意义-服务器只看到请求,而不是客户端页面生命周期,因此最坏情况下,连接应该跨越request@john通常这是自动为你处理的,所以。。。其实没什么可做的,你有什么看法?在StackOverflow上,自以为是的问题是无关紧要的。基本上,我用Dapper实现了工作单元和存储库模式。他们会一直保持连接,直到GC收集工作单元。我认为我以错误的方式实现工作单元和存储库。@RedWei理想情况下,它应该与请求的生命周期相关联,这样您就不会耗尽所有可用的连接。从你的描述看来你在泄密connections@RedWei有趣的事实:dapper不在乎你的连接是打开的还是关闭的——它会做正确的事情;只要没有跨命令的临时表,就可以使用一个简单的
更改可能是创建但不打开您的连接:任何简洁的代码都应该继续工作。谢谢@MarcGravel
using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind"))  
{  
    connection.Open();        
// Pool A is created.  
}  

using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=pubs"))  
{  
    connection.Open();        
// Pool B is created because the connection strings differ.  
}  

using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Northwind"))  
{  
    connection.Open();        
// The connection string matches pool A.  
}