PostgreSQL 和 Entity Framework 的超时问题
Timeout issue with PostgreSQL and Entity Framework
当我尝试使用以下代码通过 EntityFramework6.Npgsql
查询 PostgreSQL 数据库时:
using (MyDbContext context = new MyDbContext())
{
var res = (from b in context.mytable select new { b.Name, b.Age });
foreach (var row in res)
{
Console.WriteLine(row.Name + " - " + row.Age);
}
}
我在获取几行后出现超时异常,并出现以下错误:
[Npgsql.NpgsqlException] : {"57014: canceling statement due to
statement timeout"}
Message: 57014: canceling statement due to
statement timeout
当我在将所有数据提取到列表中时执行相同的操作时,代码工作正常:
using (MyDbContext context = new MyDbContext())
{
var res = (from b in context.mytable select new { b.Name, b.Age }).ToList();
foreach (var row in res)
{
Console.WriteLine(row.Name + " - " + row.Age);
}
}
我怀疑这与PostgreSQL管理连接池的方式有关,但我不知道如何通过Entity Framework正确处理它。
这可能与 Npgsql 管理超时的方式有关。在当前版本中,Npgsql 设置了 PostgreSQL statement_timeout
变量,这会导致 PostgreSQL 在一段时间后生成超时错误。这种方法的问题是 statement_timeout
对此不可靠:它包括网络时间、客户端处理时间等,因此在客户端花费太多时间可能会使服务器产生错误。
在您的示例中,调用 ToList() 意味着您立即下载所有结果,而不是一点一点地遍历它们。我承认奇怪的是,如此短的客户端处理(即 Console.WriteLine
)可能会引入足以触发后端超时的延迟(命令超时设置为多少?)。
请注意,由于 statement_timeout
的不可靠特性,Npgsql 的下一个主要版本将完全删除后端超时 - 请参阅 https://github.com/npgsql/npgsql/issues/689. For now you can manually disable backend timeouts by setting the Backend Timeouts
connection string parameter to false (see http://www.npgsql.org/doc/3.0/connection-string-parameters.html)。
当我尝试使用以下代码通过 EntityFramework6.Npgsql
查询 PostgreSQL 数据库时:
using (MyDbContext context = new MyDbContext())
{
var res = (from b in context.mytable select new { b.Name, b.Age });
foreach (var row in res)
{
Console.WriteLine(row.Name + " - " + row.Age);
}
}
我在获取几行后出现超时异常,并出现以下错误:
[Npgsql.NpgsqlException] : {"57014: canceling statement due to statement timeout"}
Message: 57014: canceling statement due to statement timeout
当我在将所有数据提取到列表中时执行相同的操作时,代码工作正常:
using (MyDbContext context = new MyDbContext())
{
var res = (from b in context.mytable select new { b.Name, b.Age }).ToList();
foreach (var row in res)
{
Console.WriteLine(row.Name + " - " + row.Age);
}
}
我怀疑这与PostgreSQL管理连接池的方式有关,但我不知道如何通过Entity Framework正确处理它。
这可能与 Npgsql 管理超时的方式有关。在当前版本中,Npgsql 设置了 PostgreSQL statement_timeout
变量,这会导致 PostgreSQL 在一段时间后生成超时错误。这种方法的问题是 statement_timeout
对此不可靠:它包括网络时间、客户端处理时间等,因此在客户端花费太多时间可能会使服务器产生错误。
在您的示例中,调用 ToList() 意味着您立即下载所有结果,而不是一点一点地遍历它们。我承认奇怪的是,如此短的客户端处理(即 Console.WriteLine
)可能会引入足以触发后端超时的延迟(命令超时设置为多少?)。
请注意,由于 statement_timeout
的不可靠特性,Npgsql 的下一个主要版本将完全删除后端超时 - 请参阅 https://github.com/npgsql/npgsql/issues/689. For now you can manually disable backend timeouts by setting the Backend Timeouts
connection string parameter to false (see http://www.npgsql.org/doc/3.0/connection-string-parameters.html)。