【发布时间】:2014-05-30 06:48:52
【问题描述】:
除此之外,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 询问了一个相关主题,即 - 为什么在 dapper 样本中他同时使用 GetClosedConneciton 和 GetOpenConnection 而我得到的答案是表明 - Dapper 可以处理这两种情况.然而,这个当前的问题是关于为什么它重新设置连接状态。
问题:
查看 Dapper 代码似乎是记住了状态并在操作后重新设置了状态。 (我也从旧的 sqldataadapter 类中知道这种行为)
问题是 - 为什么?如果我有一个关闭的连接 - 那么,我需要打开它。伟大的。但为什么我必须按条件关闭它?为什么不总是关闭它?它不会影响性能,因为连接实际上并没有关闭 - 它只是返回到池中。
反过来 - 如果我有一个打开的连接,那么我会继续工作并保持它打开(嗯??)
正如你可能看到的,我在这里遗漏了一些东西。有人可以解释一下吗?
【问题讨论】:
标签: c# .net connection-pooling dapper sqlconnection