gpt4 book ai didi

c# - 生产环境中无法解释的 SQL 错误 - 可能与网络有关

转载 作者:太空狗 更新时间:2023-10-29 21:53:02 26 4
gpt4 key购买 nike

我正在做一些相当密集的数据库工作,并最终将很多很多记录插入到数据库中。为了尽量减少上下文膨胀,我一次插入 100 个,处理上下文,然后重新创建上下文。

我遇到了一些我不理解的奇怪错误。这些错误只发生在我们的生产服务器上,但在开发服务器上一切正常。如果有人能阐明他们认为可能存在的问题,我将不胜感激。

System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.

System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.)

System.ComponentModel.Win32Exception: The semaphore timeout period has expired

System.Data.SqlClient.SqlException (0x80131904): A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)

System.ComponentModel.Win32Exception (0x80004005): The specified network name is no longer available

System.Data.Entity.Infrastructure.CommitFailedException: An error was reported while committing a database transaction but it could not be determined whether the transaction succeeded or failed on the database server. See the inner exception and http://go.microsoft.com/fwlink/?LinkId=313468 for more information. > System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available.)

System.ComponentModel.Win32Exception: The specified network name is no longer available`

System.Data.Entity.Core.EntityException: An exception has been raised that is likely due to a transient failure. If you are connecting to a SQL Azure database consider using SqlAzureExecutionStrategy.

System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.

System.Data.SqlClient.SqlException: A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) -

System.ComponentModel.Win32Exception: An existing connection was forcibly closed by the remote host

这些错误在过程中发生的时间是完全随机的(我有一个计数器可以告诉我发生在何处)。查看这些错误,看起来好像是网络错误。我无权访问我的数据库服务器日志,所以我无法查看那里。我的网络服务器日志对正在发生的事情没有任何启示。任何帮助都会很棒。

编辑:

我没有运行 Azure。

我也遇到了很多违反主键的错误:

System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.

System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details.

System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_dbo.MissileDataReferences'. Cannot insert duplicate key in object 'dbo.MissileDataReferences'. The duplicate key value is (4277, 2, 448388).

最佳答案

他们是不是很烦人?是的,您会在任何高流量站点中获得这些内容。

这似乎就是微软在 SQL Azure 中引入 Azure 重试策略的原因。你会希望即使他们也能保证他们的网站和他们在同一网络上同一数据中心的数据库之间的连接。但他们不能。

您可以为 Azure 启用此功能(您没有说您是否在使用 Azure,但我怀疑不是)。有关所需的连接字符串更改,请参阅 https://learn.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,因为它使您能够为每个命令显式设置重试逻辑。

为什么你不想在每次调用时都这样做(以节省每个命令的重试编码)?好吧,过去我遇到过很多问题,我们重试了插入等的逻辑,并在片刻之后再次重复(导致主键违规),因为响应没有返回给客户端。

因此,仅针对安全的“只读”调用执行此操作,如果您必须重试写入,请放置处理程序以检测重复插入,然后与服务器仔细检查并询问用户他们想要做什么。

关于c# - 生产环境中无法解释的 SQL 错误 - 可能与网络有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41927096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com