簡體   English   中英

PostgreSQL和實體框架的超時問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM