我有一个使用Entity framework 4(ObjectContext)的旧应用程序。 EF 6有DbContext。
在EF4中,我可以明确地打开数据库连接并执行如下所示的操作
using(var context = new EmployeeContext)
{
context.Connection.Open();
// and then here I am accessing some database objects
// and then calling context.SaveChanes();
}
另外在其他一些文件中,我的代码如下所示。代码没有调用context.Connection.Open();
using(var context = new EmployeeContext)
{
// here I am accessing some database objects
// and then calling context.SaveChanes();
}
我知道上述两种方法都可以使用。很多用户都使用了应用程序(有时会有大约1200个并发用户)。
现在我去了我的数据库服务器并在我的应用程序的高峰时间使用期间运行了以下查询
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NumberOfConnections,
loginame as LoginName
FROM
sys.sysprocesses
WHERE
dbid > 0
GROUP BY
dbid, loginame
当时显示了大约5000个开放的连接,这就是我在思考的时候;是因为 context.Connection.Open()作为代码没有显式调用context.Connection.Close(),因为这个连接仍然打开,这增加了数据库服务器上的负载。虽然context.Connection.Open()包含在使用块内。
请问?
答案 0 :(得分:3)
如果你看一下这段代码
using(var context = new EmployeeContext)
{
context.Connection.Open();
// and then here I am accessing some database objects
// and then calling context.SaveChanes();
}
只要context
超出using语句的范围,就会调用context.Dispose(),从而关闭连接。
对.Open()的显式调用不需要显式调用.Close(),但是您确实希望在不再需要打开连接时立即离开using块。