通过EF连接到MySql的Windows服务中的间歇性“连接中止”错误

时间:2018-01-17 11:34:49

标签: c# mysql entity-framework

我知道有很多关于这个错误的问题,但是他们中的许多人都没有答案,我正在努力解决如何排除故障的问题。

我有一个Windows服务,它扫描一个drop文件夹中是否存在文件,并在找到文件时生效。有时候 - 通常看起来,当它暂时不活动时,它会抛出这个错误:

  

MySql.Data.MySqlClient.MySqlException(0x80004005):命令执行期间遇到致命错误。
  ---> System.IO.IOException:无法将数据写入传输连接:已建立的连接已被主机中的软件中止。
  ---> System.Net.Sockets.SocketException:已建立的连接已被主机中的软件中止

以下是执行的前几行代码:

FileQueue fq = _rep.GetFile(file.FileId);
_log.Info(string.Format("Processing file {0} for job {1}", file.FileId, file.Job.Description));
SetJobToProcessing(file);

_rep是在Entity Framework上构建并连接到MySql的存储库类的实例。记录器是NLog,它写入同一数据库中的日志表。在Windows服务启动时创建实例。以下是相关的函数定义:

public void SetJobToProcessing(FileQueue file)
{
    file.Job.Status = JobStatus.Processing;
    _rep.Update(file);
    _rep.SaveChanges();
}

来自存储库:

public FileQueue GetFile(params object[] keyValues)
{
    return FileQueues.Find(keyValues);
}

public void Update<T>(T updateItem) where T : class
{
    Set<T>().AddOrUpdate(updateItem);
}

public int SaveChanges()
{
    this.SaveChanges();
}

错误是间歇性的,但似乎在服务暂时没有任何操作时会发生。所以我认为这是keepalive问题的某种超时。

但后来我注意到它发生在SetJobToProcessing的调用上。这是对序列中数据库的第三次调用 - 首先获取文件,然后记录操作,然后更新和保存数据时出错。

我可以做些什么来解决或进一步调查此问题?我是否应该编写某种连接重新测试功能,如果失败则尝试两次?也许每次服务轮询文件夹而不是实例化时创建和处理存储库对象?

0 个答案:

没有答案