Performance EF6.1:查询完成和连接关闭之间的延迟
我们正在为Oracle使用EF6.1和dotConnect 为了调试为什么我们的开发在某个客户服务器上表现不佳,我打开了DatabaseLogger拦截器功能,以在DB中执行查询,并尝试改进它们。我发现,在某些查询中,在执行查询和关闭连接之间有几秒钟的延迟。例如:Performance EF6.1:查询完成和连接关闭之间的延迟,performance,entity-framework,oracle11g,dotconnect,Performance,Entity Framework,Oracle11g,Dotconnect,我们正在为Oracle使用EF6.1和dotConnect 为了调试为什么我们的开发在某个客户服务器上表现不佳,我打开了DatabaseLogger拦截器功能,以在DB中执行查询,并尝试改进它们。我发现,在某些查询中,在执行查询和关闭连接之间有几秒钟的延迟。例如: Connection opened at 17/06/2014 9:47:42 +02:00 SELECT "top". (...) FROM ( SELECT "Project1". (...) FROM
Connection opened at 17/06/2014 9:47:42 +02:00
SELECT
"top". (...)
FROM ( SELECT
"Project1". (...)
FROM ( SELECT
"Extent1". (...)
"Extent2". (...)
FROM (...)
WHERE (...)
) "Project1"
ORDER BY (...)
) "top"
WHERE ROWNUM <= 1
-- p__linq__0: '589' (Type = Int32, IsNullable = false)
-- Executing in 17/06/2014 9:47:43 +02:00
-- Completed in 288 ms with result: aj
Connection closed at 17/06/2014 9:47:51 +02:00
正如你所看到的,有很多秒的延迟。这个查询运行了很多次,但延迟并不是在每个实例中都出现,其他实例只有2或3秒的延迟,而其他实例则没有延迟
我真的不知道从哪里开始调查。它是否与EF或dotConnect Oracle有关?执行查询并关闭连接后,将执行什么作业
编辑:这是我用来从DB检索信息的代码:
var users = db.USUARIO
.Where(x => x.COORDENADA.Any(c => c.LATITUD != 0 && c.LONGITUD != 0))
.OrderBy(x => x.NOMBRE).AsQueryable();
(...)
var list = users.ToList()
.Select(x => new
{
Usuario = x,
LastCoord = db.COORDENADA
.Include(c => c.TIPO)
.Where(c => c.USUARIOID == x.USUARIOID && c.LATITUD != 0 && c.LONGITUD != 0)
.OrderByDescending(c => c.FECHAHORAPDA)
.ThenBy(c => c.TIPO.RUTA).FirstOrDefault()
})
.Select(x => new ListItem
{
ID = x.LastCoord.COORDENADAID,
Marcadores = new List<COORDENADA>(new[] { x.LastCoord }),
Principal = x.Usuario.NOMBRE.ToTitleCase(),
Inferior1 = x.LastCoord.FECHAHORAPDA.ToString("dd/MM HH:mm"),
Color = x.LastCoord.TIPO.COLOR
});
db.COORDENADA。。。是我之前公开的查询。运行此查询后,是立即处理DbContext,还是在运行其他进程后处理?这可能是由于阻止了这一操作,导致连接处于打开状态。我添加了一些代码来显示查询是如何生成的。由于这是在MVC控制器中执行的,因此在创建控制器时会创建上下文,并在Dispose方法中处理上下文。在哪个Dispose方法中?您应该将此操作包装在一个using块中,以保证上下文被尽快处理。请翻译一下你问题中的日志:seguramente la mayoría de la gente no lo entiende;已翻译日志:。与使用脚手架模板生成的每个MVC控制器一样,DbContext被声明为类变量,并在创建时实例化:DbEntities db=new DbEntities。然后,当请求完成时,执行控制器的dispose方法,该方法已在类定义中被重写以处理上下文:protected override void Disposebool disposing{db.dispose;base.Disposedisposing;}