c# - 处理连接/查询的最佳实践

标签 c# .net

关于 C# 最佳实践的问题。我有一个迭代超过 5000 个对象并为每个对象调用后端的类:

类运行循环:

for(Object x in objects) //5000
{
   nonStaticObject.callThisMethod(x.id);
}

DAL层:

ReturnObject x = null;
using(SQLConnection...)
{
    using(SQLCommand...)
    {
         // run something here
         // if found, instantiate object x
    }
}

我做了一些分析,因为我的代码(并行 for 循环)产生了一些高 CPU 并且热点似乎是(理所当然的)我对数据库进行的所有调用。由于这些电话非常频繁,我有一些疑问。

在我看来,我的想法是,如果可能的话,我应该重用连接。这是最佳做法吗?我想让代码处理连接处理(使用 using 关键字),如何使用可用于所有 5000 次调用的策略有效地建立连接?我是否应该像现在这样在每次调用该方法时都创建一个连接? (我在某处读到 ADO 连接池自动重用连接,所以也许这已经在后台完成了?)。

感谢您的帮助

最佳答案

通常,对于数据库连接,策略应尽可能晚打开并尽可能早关闭。因此,假设您要执行单个语句/查询,则在执行查询之前打开连接,然后关闭连接。

但是,在您的情况下,您正在循环执行 5000 个查询,因此打开/关闭连接 5000 次没有意义。而是利用单一连接并执行所有查询。

此外,打开和关闭连接只是将连接返回到 .Net 连接池。如果已经有一个打开的连接,则使用 Conn.Open(); 打开一个连接将返回连接池中打开的那个连接。请参阅:SQL Server Connection Pooling (ADO.NET)Creating database connections - Do it once or for each query?

关于c# - 处理连接/查询的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27533868/

相关文章:

c# - 创建 IDataProtectionProvider asp.net core 实例

c# - KeyDown 和 keyUp 事件以避免在文本框控件中重复字母

c# - 在 F# 中实现返回 Task<T> 的 C# 方法

javascript - 类不支持数组的反序列化

.net - 扭曲的系统托盘图标

c# - 从 ImageList 中获取的图像看起来与直接从资源中获取的图像不同

c# - 如何在 C#.net 中使用 YOLO 提高物体检测速度

c# - 成员定义了不止一次的错误信息?

c# - 如何将 struct 从 C# managed 传递到 C++ unmanaged DLL 并获得 struct 结果?

.net - Web浏览器控件处理javascript : popup