我知道已经有很多关于这个错误的问题了,但是很多问题都没有答案,我正在努力解决这个问题。
我有一个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是一个基于实体框架构建并连接到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();
}
此错误是间歇性的,但似乎是在服务有一段时间没有任何事情要做时发生的。所以我推测这是某种保持连接超时的问题。
但后来我注意到它发生在 SetJobToProcessing
. 这是序列中对数据库的第三次调用—首先获取文件,然后记录操作,然后更新和保存数据时出错。
我能做些什么来解决或进一步调查这个问题?我是否应该编写某种连接重新测试函数,以便在失败时尝试两次?也许每次服务轮询文件夹而不是示例化时都会创建和处理存储库对象?
暂无答案!
目前还没有任何答案,快来回答吧!