gpt4 book ai didi

.net - 汇集我的连接对我来说有多重要?

转载 作者:行者123 更新时间:2023-12-04 22:08:52 26 4
gpt4 key购买 nike

有人建议我重新排列我的代码以“汇集”我的 ADO 连接。在每个网页上,我都会打开一个连接并继续使用相同的打开连接。但有人告诉我,这在 10 年前很重要,但现在不那么重要了。如果我在网络发布上进行 5 次分贝调用,那么使用我打开/关闭的 5 个单独的连接是否有问题?

最佳答案

与 SQL Server 的连接自动汇集在 ASP.NET 应用程序中:每个不同的连接字符串对应一个池。如果您遵循最佳实践并将数据库代码隐藏在连接字符串在整个应用程序中保持不变的 DAL 中,那么您将始终使用单个连接对象池。

那么这对您使用数据库的方法意味着什么?好吧,一方面它意味着“关闭连接”实际上转化为“将连接返回到池”,而不是真正关闭应用程序与 SQL Server 的链接。因此,关闭和重新开放并不是什么大问题。然而,话虽如此,这里有一些最佳实践可以遵循。

首先,即使您的应用程序大幅扩展,您也不希望池中的连接用完。也就是说,永远不要轮流考虑“此页面上的用户” - 考虑“使用此页面的千人”。

其次,即使关闭和重新打开连接并不费力,您通常希望以 的形式打开连接。迟到尽可能使用它直到它完成,然后将其关闭为 尽可能。唯一的异常(exception)是,如果您有一个耗时的过程,必须在检索某些数据之后和保存或检索其他数据之前进行。

第三,我强烈建议不要在页面生命周期的早期打开连接并在生命周期的后期以不同的方法关闭它。为什么?因为您能做的最糟糕的事情就是让连接保持打开状态,因为您忘记添加关闭它的逻辑。是的,当 GC 启动时,它们最终会被关闭,但是,再次,如果您正在考虑“使用此页面的数千人*,真正麻烦的机会就变得很明显了。

现在,如果你说你确定你关闭了连接,因为你总是在某个关键的、合乎逻辑的地方这样做(例如 Page_Unload 方法)。好吧,这很好,只要您可以自信地说您永远不会抛出跳出页面生命周期的错误。你不能。所以......不要在页面生命周期的一种方法中打开并在另一种方法中关闭。

最后,我强烈建议实现一个 DAL 来管理数据库连接并提供用于处理数据的工具。最重要的是,构建一个业务逻辑层 (BLL),它使用这些工具为您的 UI 提供类型安全的对象(例如“模型”对象)。如果您使用 IDisposable 接口(interface)实现 BLL 对象,那么您始终可以使用范围确保连接安全。它还可以让您在很短的时间内保持数据库连接打开:只需打开 BLL 对象,将数据拉入本地对象或列表,然后关闭 BLL 对象(超出范围)。然后,您可以在连接关闭后使用 BLL 返回的数据。

那么……这看起来像什么。好吧,在您的页面(UI)上,您将使用如下业务逻辑类:

using (BusinessLogicSubClass bLogic = new BusinessLogicSubClass())
{
// Retrieve and display data or pull from your UI and update
// using methods built into the bLogic object
.
.
.
} // <-- Going out of scope will automatically call the dispose method and close the database connection.

您的 BusinessLogicSubClass 将派生自实现 IDisposable 的 BusinessLogic 对象。它将实例化您的 DAL 类并打开一个连接,如下所示:
public class BusinessLogic : IDisposable
{
protected DBManagementClass qry;
public BusinessLogic()
{
qry = new DBManagementClass();
}

public void Dispose()
{
qry.Dispose(); <-- qry does the connection management as described below.
}

... other methods that work with the qry class to
... retrieve, manipulate, update, etc. the data
... Example: returning a List<ModelClass> to the UI ...

}

当 BusinessLogic 类超出范围时,会自动调用 Dispose 方法,因为它实现了 IDisposable 接口(interface)。

您的 DAL 类将具有匹配的方法:
public class DBManagementClass : IDisposable
{
public static string ConnectionString { get; set; } // ConnectionString is initialized when the App starts up.

public DBManagementClass()
{
conn = new SqlConnection(ConnectionString);
conn.Open();
}

public void Dispose()
{
conn.Close();
}

... other methods
}

鉴于我到目前为止所描述的,DAL 不必是 IDisposable。但是,当我测试新的 BLL 方法时,我在测试代码中广泛使用了我的 DAL 类,因此我将 DAL 构造为 IDisposable,这样我就可以在测试期间使用“使用”构造。

遵循这种方法,从本质上讲,您将永远不必再考虑连接池。

关于.net - 汇集我的连接对我来说有多重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com