我知道有很多关于这个错误的问题,但是他们中的许多人都没有答案,我正在努力解决如何排除故障的问题。
我有一个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
的调用上。这是对序列中数据库的第三次调用 - 首先获取文件,然后记录操作,然后更新和保存数据时出错。
我可以做些什么来解决或进一步调查此问题?我是否应该编写某种连接重新测试功能,如果失败则尝试两次?也许每次服务轮询文件夹而不是实例化时创建和处理存储库对象?