如何找到导致EntityCommandExecutionException外观的内容

时间:2013-12-30 11:16:14

标签: c# mysql exception execution devart

我正在使用实体框架(DevArt的数据提供者)使用mysql数据库。我注意到有时在日志中我得到了这样的例外:

  

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

这个异常同时发生了几次(?一次丢掉几个连接......)并且在它发生之后 - 一切都运行良好一段时间。我试过了

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

3 个答案:

答案 0 :(得分:2)

在查询期间"与MySQL服务器失去连接的可能原因"错误:

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

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

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

  2. 网络问题

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

Devart建议在连接字符串(; Default Command Timeout = 6000;)中设置此值,但在我的情况下似乎不赞成使用连接字符串'Default Command Timeout'(我通过设计器方法调用存储过程) ),最后我在下面的代码中更新了命令超时值,从而解决了我的问题。

            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);
            }