每次不使用就创建不同的数据库上下文有什么问题吗
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
事情您负责,当您完成它时.也许有一些例外(HttpClient
、DataTable
等)。
请注意,如果您的 using
语句结束当前范围的(即到下一个 }
):
using var context = CreateContextFactory().Create();
return context.QueryOpenConnectionCount();
或者甚至使用早期的 C#,您可以使其更简单并删除本地:
using (var context = CreateContextFactory().Create())
{
return context.QueryOpenConnectionCount();
}
嗯,我想知道使用下面的方法可能会遇到什么问题
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
事情您负责,当您完成它时.也许有一些例外(HttpClient
、DataTable
等)。
请注意,如果您的 using
语句结束当前范围的(即到下一个 }
):
using var context = CreateContextFactory().Create();
return context.QueryOpenConnectionCount();
或者甚至使用早期的 C#,您可以使其更简单并删除本地:
using (var context = CreateContextFactory().Create())
{
return context.QueryOpenConnectionCount();
}