gpt4 book ai didi

c# - 还记得 .net 中的 SQL 连接状态吗?

转载 作者:行者123 更新时间:2023-11-30 13:26:25 26 4
gpt4 key购买 nike

此外,connection.Close()connection.Dispose() 是相同的旧事实 - 除了运行 Close() 在已关闭的连接上运行 Close() 时引发异常 - 没问题 - 我还有一个问题:

假设连接池开启,(默认)- 为什么记住连接状态很重要?

我读过 this question here这表明 - 避免打开和关闭连接可以节省性能

这似乎合乎逻辑,但问题是连接从未实际上关闭了!它只是标记为关闭。

即使我在 using 范围内使用它 - dispose 也只是关闭连接并将其放回池中。

即使我想要,我也不能让它打开(因为我想让其他人使用它)。所以我不得不关闭/处理它。

Looking at Dapper这也实现了这种行为:

public static async Task<IEnumerable<T>> QueryAsync<T>(this...)
{
//...
bool wasClosed = cnn.State == ConnectionState.Closed;
using (var cmd = (DbCommand)command.SetupCommand(cnn, info.ParamReader))
{
try
{
if (wasClosed) await ((DbConnection)cnn).OpenAsync()...
//...
}
finally
{
if (wasClosed) cnn.Close();
}
}
}

如你所见,这里实现了“内存”。

nb ,我已经问过 Marc 关于一个相关主题的问题 - 为什么在小巧的示例中他同时使用 GetClosedConnecitonGetOpenConnection 我得到的答案是展示 - Dapper 可以处理这两种情况。然而,当前的问题是关于为什么要重置连接状态。

问题:

看Dapper的代码,好像是内存状态,运行后重新设置状态。 (我也从旧的 sqldataadapter 类中知道这种行为)

问题是 - 为什么?如果我有一个关闭的连接 - 那么,我需要打开它。伟大的。但为什么我必须按条件关闭它?为什么不总是关闭它?它不会损害性能,因为连接实际上并没有关闭——它只是返回到池中。

反过来 - 如果我有一个开放的连接,那么我会继续工作并保持它开放(哈??)

正如您可能看到的那样,我在这里遗漏了一些东西。有人可以阐明一下吗?

最佳答案

why not ALWAYS close it ?

用户可能正在该连接上做很多工作。它可能与交易相关联(关闭会使它孤立)。它可以有临时表(关闭会破坏它们),或其他连接保留状态(SET 选项、模拟等)。

在此处关闭连接(如果它最初是打开的)将是一件不寻常且出乎意料的事情,并且会产生多种不良副作用。

关于c# - 还记得 .net 中的 SQL 连接状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23948684/

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