[英]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:由於語句超時而取消語句”}
消息:57014:由於語句超時而取消語句
當我在將所有數據提取到List時執行相同的操作時,代碼工作正常:
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 。 現在,您可以通過將Backend Timeouts
連接字符串參數設置為false來手動禁用后端超時(請參閱http://www.npgsql.org/doc/3.0/connection-string-parameters.html )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.