每次不使用就创建不同的数据库上下文有什么问题吗

Is there any problem about create different Database contexts every time without using

嗯,我想知道使用下面的方法可能会遇到什么问题

CreateContextFactory().Create().QueryOpenConnectionCount();

而不是:

using (var context = CreateContextFactory().Create())
{
      openConnectionCount = context.QueryOpenConnectionCount();
}
return openConnectionCount;

如果有任何问题,例如:

CreateContextFactory().Create().QueryOpenConnectionCount1();
CreateContextFactory().Create().QueryOpenConnectionCount2();
CreateContextFactory().Create().QueryOpenConnectionCount3();

这是因为我在 class 中有一些方法是如上所述的开放数据库上下文,我可以为它们创建一个 using 语句,但是我需要为所有方法传递上下文,并且我还需要重构一个使用数据库上下文执行事务的助手(因为它在内部创建了自己的上下文)。那么让代码一直这样有什么问题呢?

通常,一个数据上下文 "owns" 一个连接,以避免不断地从池中获取一个连接并对其进行初始化。处理数据上下文通常会处理该连接。

所以:如果你继续创建数据上下文 而没有 正确地处理它们,你就会破坏连接,至少在 GC 介入并消除混乱之前(释放 unmanaged 部分连接返回非托管池,如果有 非托管部分)。

这是一件坏事,它会严重限制可伸缩性并增加与数据库服务器的打开连接数。所以是的,你应该处理你的数据上下文。将其扩展到一般情况:您处理 任何 IDisposable 事情您负责,当您完成它时.也许有一些例外(HttpClientDataTable 等)。

请注意,如果您的 using 语句结束当前范围的(即到下一个 }):

using var context = CreateContextFactory().Create();
return context.QueryOpenConnectionCount();

或者甚至使用早期的 C#,您可以使其更简单并删除本地:

using (var context = CreateContextFactory().Create())
{
    return context.QueryOpenConnectionCount();
}