繁体   English   中英

在数据库调用之间共享ASP.NET Web App中的SqlConnection对象

[英]Share SqlConnection object in ASP.NET Web App Between DB calls

是否有一种方法可以有效地在至少来自同一页面或同一请求或整个应用程序的调用之间共享单个SqlConnection实例?

如果您正在使用ADO.NET或利用任何框架ADO.NET ,那么它很可能已经连接池为您服务。

您正在使用什么数据库? -连接池可能会根据数据库类型而有所不同。

您始终可以通过监视数据库服务器连接来验证这一点。

例如,在SQL Server上, sp_who2将列出所有连接。 在您的计算机上查找连接,并注意到在Web应用程序页面加载之间, spid (每个连接的唯一标识)保持不变。

如果您想知道如何做到这一点,答案是通过在页面内部声明一个SqlConnection类型的静态变量,并将其用于所有页面方法中的数据库访问。 但是, 这是一个可怕的想法 ,原因很多:

  1. 正如许多人指出的那样,SQLConnections是池化的,因此无需尝试避免为每个数据库访问打开连接。 这样做不会提高性能。

  2. 请记住,对您的应用程序的每个请求都将由来自应用程序池的不同线程来处理。 如果您有这样的静态变量,则对同一页面的2个并发请求可能最终访问同一SqlConnection实例,并且您可能会遇到以下情况:第二个请求正在从数据库中检索数据时,第一个请求可能会关闭连接意外。

  3. 您应该在应用程序体系结构的不同层上执行数据访问操作。 一个好的方法是拥有一个业务层,该业务层引用一个应用程序数据访问层,而该应用程序又负责执行数据访问操作。 这提供了更大的封装,关注点分离并提高了可维护性,可重用性等。 这是一篇很好的文章,对这一想法进行了说明。

那真是个坏主意。 SqlConnection实现IDisposable ,这意味着您必须将其处置以尽快释放资源。

如前所述,引擎盖下的连接池已经优化了连接的创建。 如果您开始保持连接,可能会遇到严重的问题,我一次又一次看到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM