【问题标题】:PostgreSQL query (EF + Devart) fails in application, but works in PgAdminPostgreSQL 查询(EF + Devart)在应用程序中失败,但在 PgAdmin 中有效
【发布时间】:2017-01-09 10:43:40
【问题描述】:

我的一个 SQL (PostgreSQL) 查询出现问题,该查询由带有 Devart 连接器的实体框架生成。正好 60 秒后(每次),我得到一个错误:

System.Data.Entity.Core.EntityCommandExecutionException:错误 执行命令定义时发生。见内 细节例外。 ---> Devart.Data.PostgreSql.PgSqlException: 读取失败 ---> System.IO.IOException: 读取失败 ---> System.Net.Sockets.SocketException:连接尝试失败 因为连接方在一段时间后没有正确响应 时间,或建立连接失败,因为连接的主机有 没有回应 在 System.Net.Sockets.Socket.Receive(System.Byte[] 缓冲区,Int32 偏移量,Int32 大小,SocketFlags 标志)[0x00000] in :0 在 System.Net.Sockets.NetworkStream.Read(System.Byte[] 缓冲区,Int32 偏移量,Int32 大小)[0x00000] in :0 --- 内部异常堆栈跟踪结束 --- 在 System.Net.Sockets.NetworkStream.Read(System.Byte[] 缓冲区,Int32 偏移量,Int32 大小)[0x00000] in :0 在 Devart.Common.au.a (System.Byte[] A_0, Int32 A_1, Int32 A_2) [0x00000] in :0 --- 内部异常堆栈跟踪结束 --- 在 Devart.Data.PostgreSql.aa.d (System.Exception A_0) [0x00000] in :0 在 Devart.Common.z.d (System.Byte[] A_0, Int32 A_1, Int32 A_2) [0x00000] in :0 在 Devart.Common.ae.a (System.Byte[] A_0, Int32 A_1, Int32 A_2) [0x00000] in :0 在 Devart.Data.PostgreSql.x.c (System.Byte[] A_0, Int32 A_1, Int32 A_2) [0x00000] in :0 在 Devart.Data.PostgreSql.x.f () [0x00000] 中:0 在 Devart.Data.PostgreSql.ai.a (Boolean A_0, Boolean A_1, Char A_2, Boolean A_3) [0x00000] in :0 在 Devart.Data.PostgreSql.ai.b (Boolean A_0, Boolean A_1) [0x00000] in :0 在 Devart.Data.PostgreSql.ai.c (Boolean A_0) [0x00000] in :0 在 Devart.Data.PostgreSql.ae.b (Boolean A_0) [0x00000] in :0 在 Devart.Data.PostgreSql.ae.g (Devart.Data.PostgreSql.ac A_0) [0x00000] 在:0 在 Devart.Data.PostgreSql.ae.b (Devart.Data.PostgreSql.ac A_0) [0x00000] 在:0 在 Devart.Data.PostgreSql.ac.af () [0x00000] 在 :0 在 Devart.Data.PostgreSql.PgSqlDataReader.f (Int32 A_0) [0x00000] 在:0 --- 内部异常堆栈跟踪结束 --- 在 System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (System.Data.Entity.Core.EntityClient.EntityCommand entityCommand, CommandBehavior 行为)[0x00000] in :0 在 System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[LisExaminationRequest] (System.Data.Entity.Core.Objects.ObjectContext 上下文, System.Data.Entity.Core.Objects.ObjectParameterCollection 参数值)[0x00000] in :0 [错误] 致命的未处理异常:System.Data.Entity.Core.EntityCommandExecutionException:错误 执行命令定义时发生。见内 细节例外。 ---> Devart.Data.PostgreSql.PgSqlException: 读取失败 ---> System.IO.IOException: 读取失败 ---> System.Net.Sockets.SocketException:连接尝试失败 因为连接方在一段时间后没有正确响应 时间,或建立连接失败,因为连接的主机有 没有回应 在 System.Net.Sockets.Socket.Receive(System.Byte[] 缓冲区,Int32 偏移量,Int32 大小,SocketFlags 标志)[0x00000] in :0 在 System.Net.Sockets.NetworkStream.Read(System.Byte[] 缓冲区,Int32 偏移量,Int32 大小)[0x00000] in :0 --- 内部异常堆栈跟踪结束 --- 在 System.Net.Sockets.NetworkStream.Read(System.Byte[] 缓冲区,Int32 偏移量,Int32 大小)[0x00000] in :0 在 Devart.Common.au.a (System.Byte[] A_0, Int32 A_1, Int32 A_2) [0x00000] in :0 --- 内部异常堆栈跟踪结束 --- 在 Devart.Data.PostgreSql.aa.d (System.Exception A_0) [0x00000] in :0 在 Devart.Common.z.d (System.Byte[] A_0, Int32 A_1, Int32 A_2) [0x00000] in :0 在 Devart.Common.ae.a (System.Byte[] A_0, Int32 A_1, Int32 A_2) [0x00000] in :0 在 Devart.Data.PostgreSql.x.c (System.Byte[] A_0, Int32 A_1, Int32 A_2) [0x00000] in :0 在 Devart.Data.PostgreSql.x.f () [0x00000] 中:0 在 Devart.Data.PostgreSql.ai.a (Boolean A_0, Boolean A_1, Char A_2, Boolean A_3) [0x00000] in :0 在 Devart.Data.PostgreSql.ai.b (Boolean A_0, Boolean A_1) [0x00000] in :0 在 Devart.Data.PostgreSql.ai.c (Boolean A_0) [0x00000] in :0 在 Devart.Data.PostgreSql.ae.b (Boolean A_0) [0x00000] in :0 在 Devart.Data.PostgreSql.ae.g (Devart.Data.PostgreSql.ac A_0) [0x00000] 在:0 在 Devart.Data.PostgreSql.ae.b (Devart.Data.PostgreSql.ac A_0) [0x00000] 在:0 在 Devart.Data.PostgreSql.ac.af () [0x00000] 在 :0 在 Devart.Data.PostgreSql.PgSqlDataReader.f (Int32 A_0) [0x00000] 在:0 --- 内部异常堆栈跟踪结束 --- 在 System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (System.Data.Entity.Core.EntityClient.EntityCommand entityCommand, CommandBehavior 行为)[0x00000] in :0 在 System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[LisExaminationRequest] (System.Data.Entity.Core.Objects.ObjectContext 上下文, System.Data.Entity.Core.Objects.ObjectParameterCollection parameterValues) [0x00000] in :0

我尝试在连接字符串中尝试超时,但没有帮助。这是DbContext.DataBase.Connection.ConnectionString的内容

User Id=myuser;Host=myhost;Port=5432;Database=mydatabase;Unicode=True;Connection Timeout=300;Default Command Timeout=300;SSLMode=Disable;

这个查询(由EF 生成)非常大。它有超过 6500 行代码(query 不是结果)并由许多 UNION 语句组成。

PgAdmin 中手动运行相同的查询大约需要 120 秒。

【问题讨论】:

  • 连接设置不正确。请检查您是否可以使用这些凭据从该服务器进行连接。
  • @JakubKania 连接设置正常。其他查询工作正常。
  • 在这种情况下尝试手动超时连接,如SELECT pg_sleep(120) 并查看错误是否相同。
  • @JakubKania pg_sleep 使用 DbContext.Database.Connection.CreateCommand() 调用(与我用于 EF 的上下文相同)工作正常。在我将连接字符串中的超时更改为默认值后 - 它失败并显示正常消息“错误:08006:服务器在指定的超时间隔内没有响应”。
  • 因此,如果查询超时错误不同,我仍然认为有问题的查询不是使用相同的连接运行的。

标签: c# entity-framework postgresql devart


【解决方案1】:

默认命令超时=300;

您能否请send us 一个带有相应 DDL/DML 脚本的小型测试项目来重现忽略默认命令超时连接字符串参数的问题?

【讨论】:

  • 在这种情况下,我无法提取小项目。不过,问题已经解决了。数据库运行状况不佳。备份和还原(同一台服务器)后,一切恢复正常。不过,奇怪的是查询在 PgAdmin 中运行良好,但在应用程序中失败。如果您愿意,我可以将生成的 SQL 和相关的 LINQ 代码发送给您。
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 2018-10-28
  • 2011-04-13
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多