我正在使用实体框架(DevArt的数据提供者)使用mysql数据库。我注意到有时在日志中我得到了这样的例外:
System.Data.EntityCommandExecutionException :发生错误 执行命令定义。有关详细信息,请参阅内部异常 ---> Devart.Data.MySql.MySqlException :在查询期间丢失与MySQL服务器的连接
---> System.TimeoutException :服务器没有响应 在指定的超时间隔内 ---> System.IO.IOException :无法从传输连接读取数据:连接 尝试失败,因为关联方没有正确回应 一段时间后,或建立连接失败,因为 连接主机未能响应。
---> System.Net.Sockets.SocketException :连接尝试失败 因为关联方在一段时间后没有正确回应 时间或已建立的连接因连接的主机而失败 未能回复
这个异常同时发生了几次(?一次丢掉几个连接......)并且在它发生之后 - 一切都运行良好一段时间。我试过了
我知道这个错误可能过于笼统,但需要建议如何避免这种情况?
尝试增加池中的连接和Validate Connection=true;
- 没有运气。
答案 0 :(得分:2)
在查询期间"与MySQL服务器失去连接的可能原因"错误:
连接由MySQL服务器关闭:
查找MySQL服务器日志中的任何错误
检查MySQL服务器上的wait_timeout变量的值
网络问题
该问题特定于dotConnect for MySQL:set" Validate Connection = true;"连接字符串中的选项,用于在每次从池中检索连接时验证连接(性能较差,应在具有不稳定连接的环境中使用)。如果"验证连接=假;" (默认) - 连接仅在每隔30秒在池中验证(不检查是否从池中检索它)
如果明确提供与DbContext(或ObjectContext)对象的纯ADO.NET连接,请考虑以下几点:
MySqlConnection对象不是线程安全的。您应该避免同时在多个线程中使用相同的MySqlConnection
您可以在应用程序中实现故障转移逻辑:
答案 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);
}