我正在做一些相当密集的数据库工作,并最终在数据库中插入了许多记录。为了最大限度地减少上下文膨胀,我一次执行100次插入,处理上下文,并重新创建上下文。
我得到了一些我不理解的奇怪错误。这些错误只发生在我们的生产服务器上,但在开发服务器上一切都很好。如果有人能够对他们认为可能存在的问题有所了解,我一定会很感激。
System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常
System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供者:TCP提供者,错误:0 - 信号量超时期限已过期。)
System.ComponentModel.Win32Exception:信号量超时期限已过期
System.Data.SqlClient.SqlException(0x80131904):从服务器接收结果时发生传输级错误。 (提供者:TCP提供者,错误:0 - 指定的网络名称不再可用。)
System.ComponentModel.Win32Exception(0x80004005):指定的网络名称不再可用
System.Data.Entity.Infrastructure.CommitFailedException:提交数据库事务时报告了错误,但无法确定数据库服务器上的事务是成功还是失败。有关详细信息,请参阅内部异常和http://go.microsoft.com/fwlink/?LinkId=313468。 > System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误。 (提供者:TCP提供者,错误:0 - 指定的网络名称不再可用。)
System.ComponentModel.Win32Exception:指定的网络名称不再可用。
System.Data.Entity.Core.EntityException:引发了一个异常,可能是由于瞬态故障引起的。如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy。
System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常
System.Data.SqlClient.SqlException:将请求发送到服务器时发生传输级错误。 (提供者:TCP提供者,错误:0 - 远程主机强行关闭现有连接。) -
System.ComponentModel.Win32Exception:远程主机强行关闭现有连接
这些错误在过程中发生的时间是完全随机的(我有一个告诉我在哪里的计数器)。查看这些错误,看起来好像是网络错误。我无法访问我的数据库服务器日志,所以我无法查看。我的网络服务器日志不会对正在发生的事情有任何启发。任何帮助都会很棒。
编辑:
我没有运行Azure。
我也遇到了大量的主键违规错误:
System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常
System.Data.Entity.Core.UpdateException:更新条目时发生错误。有关详细信息,请参阅内部异常
System.Data.SqlClient.SqlException:违反PRIMARY KEY约束'PK_dbo.MissileDataReferences'。无法在对象'dbo.MissileDataReferences'中插入重复键。重复键值为(4277,2,448388)。
答案 0 :(得分:1)
烦人不是吗?是的,您可以在任何大量网站上获取这些内容。
这似乎是微软在SQL Azure中引入Azure重试策略的原因。您甚至希望他们能够保证他们的网站与他们的数据库在同一网络上的同一数据中心之间建立连接。但他们不能。
您可以为Azure启用此功能(如果您使用的是Azure,则不要说,但我不怀疑)。有关所需的连接字符串更改,请参阅https://docs.microsoft.com/en-us/azure/sql-database/sql-database-connectivity-issues。
https://msdn.microsoft.com/en-us/library/dn456835(v=vs.113).aspx还涵盖Azure上的EF6。
也许这不是您想要的答案,但我认为您应该考虑使用Polly library,因为它可以为每个命令显式设置重试逻辑。
为什么不想为每次调用执行此操作(为了保存每个命令的重试编码)?好吧,我过去曾经遇到过很多问题,我们已经重新尝试了插入等等的逻辑并且稍后再次重复(导致主键违规),因为响应并没有回到客户端。
所以只能这样才能安全,只读#39;调用,如果你必须在写入时重试,将处理程序放在适当位置以检测重写插入,然后仔细检查服务器并询问用户他们想要做什么。