【发布时间】:2018-03-23 16:01:22
【问题描述】:
在我们的 Web 应用程序(在 Azure 上运行)中,用户上传了几个 XML 文件。这些文件保存在 Azure 云存储中,并在表中插入一条记录。
我们还有一个 Web 作业(用 C# 编写)正在查看该表,当插入新记录时,它会从存储中下载 XML 文件,对其进行解析并将数据保存到多个表中。
这运行良好超过 2 年。最近我们的客户正在上传更大的 XML 文件 (300+ MB),处理时间更长,我们遇到了time-out errors。增加超时后,我们得到了Out-of-Memory errors。
我们现在使用来自ZZProjects 的BulkSaveChanges,我们不再使用OOM-exceptions,作为奖励,现在节省大约需要17 分钟而不是3 多个小时。
对于一些(大约 10%)的大文件,我们会遇到以下类型的错误:
2018-02-23 01:19:06,993 [1] DEBUG Services.DeclarationService - Ready to save to the db
2018-02-23 01:21:10,778 [1] ERROR DataAccess.ApplicationUoW -
Error in saving data: 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.Data.SqlClient.SqlException (0x80131904): 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 (0x80004005): An existing connection was forcibly closed by the remote host
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParserStateObject.SNIWritePacket(SNIHandle handle, SNIPacket packet, UInt32& sniError, Boolean canAccumulate, Boolean callerHasConnectionLock)
at System.Data.SqlClient.TdsParserStateObject.WriteSni(Boolean canAccumulate)
at System.Data.SqlClient.TdsParserStateObject.WritePacket(Byte flushMode, Boolean canAccumulate)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName, Boolean shouldReconnect)
at System.Data.SqlClient.SqlConnection.BeginTransaction(IsolationLevel iso, String transactionName)
at System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.Common.DbConnection.BeginTransaction()
at DbContextExtensions..(BulkOperation )
at Z.EntityFramework.Extensions.EntityBulkOperation`1.(Action`1 )
at DbContextExtensions.[](DbContext , Action`1 )
at DbContextExtensions.[](DbContext , IEnumerable`1 , Action`1 , List`1 )
at Z.EntityFramework.Extensions.BulkSaveChanges.(DbContext , List`1 , List`1 , Action`1 )
at DbContextExtensions.(DbContext , Boolean , Action`1 , Boolean )
ClientConnectionId:####
Error Number:10054,State:0,Class:20
ClientConnectionId before routing:####
Routing Destination:####,11003
我已经在互联网上搜索了几天,我看到了类似的问题,但它们主要与 MSSMS 等客户端软件有关,并通过重新打开客户端软件来解决。我没有在本地使用客户端软件。一切都在 Azure 上运行。
我们的网络应用程序中确实有一个手动重试机制,当我重试失败的 XML 文件时,它一直失败。但是当我在本地运行我的网络作业(它只是一个.exe)但仍然连接到我的 Azure SQL 数据库和 Azure 存储时,失败的 XML 文件确实得到了处理。
我已经明白这是一个非常普遍的错误。如果我能获得有关引发此错误的原因的更多详细信息,那就太好了。但我在 Azure 上找不到更多日志记录。
我正在保存一个可能有多个子对象的对象,因此很难拆分对象并保存较小的部分。
虽然 Azure 每周会重新启动几次 (very nice on a production environment ;(),但在出现上述问题时不会发生这种情况。
任何建议或意见将不胜感激。
【问题讨论】:
-
Azure 中会出现瞬时连接错误,您应该查看瞬时故障处理应用程序块。这可能由于节流而被杀死。见odehne.wordpress.com/2013/04/18/… 和msdn.microsoft.com/en-us/library/…
-
另见此 MSDN 博客 blogs.msdn.microsoft.com/spike/2009/04/16/…
-
感谢@SteveFord 的帮助。使用您的建议,我做了更多研究,发现msdn.microsoft.com/en-us/library/dn456835(v=vs.113).aspx 似乎 EF6 不需要软件包,只需要一些配置。我将
SetExecutionStrategy("System.Data.SqlClient",() => new SqlAzureExecutionStrategy(3, TimeSpan.FromSeconds(30)));添加到我的DbConfiguration并再次开始我的多日网络作业。没有帮助再次获得几个A transport-level error has occurred。我想我会建议我的客户离开 Azure。
标签: azure tcp azure-sql-database azure-webjobs