好吧,我想知道使用以下方法可能出现的问题
CreateContextFactory().Create().QueryOpenConnectionCount();
代替:
using (var context = CreateContextFactory().Create())
{
openConnectionCount = context.QueryOpenConnectionCount();
}
return openConnectionCount;
以及类似问题是否存在:
CreateContextFactory().Create().QueryOpenConnectionCount1();
CreateContextFactory().Create().QueryOpenConnectionCount2();
CreateContextFactory().Create().QueryOpenConnectionCount3();
这是因为我在类中有一些如上所述的方法是开放式db上下文,我可以为它们创建一个using语句,但是因此我需要为所有方法传递上下文,并且还需要重构一个使用db上下文执行事务(因为它在内部创建自己的上下文)。那么,让代码保持这种方式存在什么问题呢?
通常,数据上下文“拥有”一个连接,以避免不断地从池中获取一个连接并对其进行初始化。处理数据上下文通常会处理该连接。
所以:如果你继续创建数据上下文不恰当地处置他们,你是出血的连接,至少要等到GC中,并撤消步骤残局(释放非托管的连接返回到非托管池的一部分,如果是一个非托管的部分)。
这是一件坏事,并严重限制了可伸缩性,并增加了与数据库服务器的打开连接数。因此,是的,您应该处理数据上下文。将其扩展到一般情况:完成后,请处置您负责的任何 IDisposable
事物。随着或许有少数例外(,,等)。HttpClient
DataTable
请注意,如果您的using
语句到达当前作用域的末尾(即到下一个范围),则C#8的语法稍微有点麻烦(我会说“ nicer”,但这是主观的;我非常喜欢}
)。
using var context = CreateContextFactory().Create();
return context.QueryOpenConnectionCount();
甚至使用早期的C#,您都可以使其变得更简单并删除本地:
using (var context = CreateContextFactory().Create())
{
return context.QueryOpenConnectionCount();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句