【问题标题】:How to find whats causing EntityCommandExecutionException appearance如何找到导致 EntityCommandExecutionException 出现的原因
【发布时间】:2014-01-17 06:30:53
【问题描述】:

我正在使用实体框架(DevArt 的数据提供者)处理 mysql 数据库。我注意到有时在日志中我会遇到这样的异常:

System.Data.EntityCommandExecutionException:发生错误时 执行命令定义。有关详细信息,请参阅内部异常。
---> Devart.Data.MySql.MySqlException:查询期间与 MySQL 服务器的连接丢失
---> System.TimeoutException:服务器没有响应 在指定的超时间隔内。
---> System.IO.IOException:无法从传输连接中读取数据:连接 尝试失败,因为连接方没有正确响应 一段时间后,或建立连接失败,因为 连接的主机未能响应。
---> System.Net.Sockets.SocketException:连接尝试失败 因为连接方在一段时间后没有正确响应 时间,或建立连接失败,因为连接的主机有 没有回应

并且该异常同时发生了好几次(?一次断开多个连接..)并且在它发生之后 - 一段时间内一切正常。我试过了

我知道这个错误可能过于笼统,但需要关于如何避免这种情况的建议?.. 尝试增加池中的连接和Validate Connection=true; - 不走运。

【问题讨论】:

    标签: c# mysql exception execution devart


    【解决方案1】:

    这也发生在我身上,但对我没有任何帮助我想我不属于上述用例。 Devart 有默认命令超时,它似乎在默认超时 30 秒后停止执行。

    Devart 建议在连接字符串中设置此值 (;Default Command Timeout=6000;) 但连接字符串“默认命令超时”值似乎没有得到遵守,所以最后我更新了代码中的命令超时值,例如下面解决了我的问题。

                using (var model = new MyEntities())
                {
                    System.Data.Entity.DbContext dbContext = model as System.Data.Entity.DbContext;
                    dbContext.Database.CommandTimeout = 6000;
                    model.CallProcedure1(idProcess);
                    model.CallProcedure2(idProcess);
                }
    

    【讨论】:

    • 我们刚刚从 DevArt 迁移:当我们询问我们的问题时,他们的支持甚至没有打扰,尽管我们是付费订阅者。其他驱动程序在我们检查时具有更准确的错误信息,并且没有性能损失:因此我们最终使用原生 Oracle 驱动程序。
    【解决方案2】:

    “Lost connection to MySQL server during query”错误的可能原因:

    1. 连接被 MySQL 服务器关闭:

      • 在 MySQL 服务器的日志中查找任何错误

      • 检查 MySQL 服务器上 wait_timeout 变量的值

    2. 网络问题

    3. 此问题特定于 dotConnect for MySQL:设置“Validate Connection=true;”连接字符串中的选项,用于在每次从池中检索连接时验证连接(性能较低,应在连接不稳定的环境中使用)。如果“验证连接=假;” (默认)- 仅每隔约 30 秒在池中验证连接(不检查不从池中检索它)

    如果您明确提供到 DbContext(或 ObjectContext)对象的普通 ADO.NET 连接,请考虑以下几点:

    1. MySqlConnection 对象不是线程安全的。您应该避免在多个线程中同时使用相同的 MySqlConnection

    2. 您可以在应用程序中实现故障转移逻辑:

    【讨论】:

    • 我会重新检查,但没有网络问题(不经常),禁用连接池帮助。此外,似乎最新更新的 devart 版本肯定效果更好。将更多地尝试验证连接属性。谢谢你的回答。
    【解决方案3】:

    似乎更新到 2013 年 9 月版本的 mysql 提供程序(已安装 2013 年 8 月)和禁用连接池在这种情况下有所帮助。将等待 1 天,然后启用池化。如果这也有效 - 这是“版本的”错误,在其他情况下 - 禁用连接池会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-08
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2023-02-08
      • 2013-05-27
      相关资源
      最近更新 更多