我无法使用C#webapi将大量数据插入Azure SQL服务器数据库
考虑
我想在SQL中插入60K>数据。在我的本地sql服务器中没有问题,但是在Azure SQL中,它的连接超时
我的方法:(所有人都在本地sql服务器中工作,但不在Azure sql服务器中工作)
1)使用EF对其插入记录进行一次尝试(10000次约10分钟,大多数情况下超时)
2)尝试将批量插入扩展与EF一起使用3)尝试在SqlBulkCopy中
4)尝试增加连接字符串中的连接超时
5)尝试在Dbcontext中增加命令超时。
异常StackTrace
Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding. System.Data.SqlClient.SqlException (0x80131904): Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out 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.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer() at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlBulkCopy.RunParser(BulkCopySimpleResultSet bulkCopyHandler) at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinuedOnSuccess(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source) at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken) at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken) at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)
在Azure中是否有任何解决方案或要更改的配置?
更新资料
用于批量插入的代码
using (var dbConnection = new DBModel().Database.Connection as SqlConnection) { dbConnection?.Open(); using (var sqlBulkCopy = new SqlBulkCopy(dbConnection)) { try { /* ColumnMapping * Column is mapped to DB Column to DataTable Column * */ sqlBulkCopy.EnableStreaming = true; sqlBulkCopy.BulkCopyTimeout = 500; sqlBulkCopy.DestinationTableName = "LogTable"; //dt is object of the Datatable sqlBulkCopy.WriteToServer(dt); } catch (Exception ex) { } } }
小智.. 5
我建议您将其设置sqlBulkCopy.BatchSize
为合理的数量,而不是将所有内容批量插入。根据要插入的数据,尝试从10.000开始,然后上下移动,直到对性能满意为止。
编辑以获得更多说明:考虑批处理大小时,需要考虑SqlBulkCopy不仅需要插入数据,还需要读取并发送数据-最后一部分可能是其在本地运行的原因SQL Server,但是不在Azure上-这还意味着,如果要使用大型数据集,则需要使用较小的批处理大小或相当大的BulkCopyTimeout设置,以使每个批处理有机会在达到超时限制。
您可以在这篇文章中阅读有关批量大小的更多信息。 SqlBulkCopy的建议批处理大小是多少?
其他选择:
我正在阅读此书,这可能仅仅是因为您的插入内容达到了关键的DTU(数据库事务单元,基本上是对服务器组合资源的一种度量)使用点。
对性能级别进行了校准和控制,以提供所需的资源来运行数据库工作负载,直至达到所选服务层/性能级别所允许的最大限制。如果您的工作负载达到CPU /数据IO /日志IO限制之一的限制,您将继续以允许的最大级别接收资源,但是查询的等待时间可能会增加。这些限制不会导致任何错误,而只会导致您的工作负载减慢,除非该减慢变得如此严重以至于查询开始超时。
从此链接获取:https : //azure.microsoft.com/da-dk/blog/azure-sql-database-introduces-new-near-real-time-performance-metrics/
尝试在监视DTU的同时再次启动副本使用情况,并查看它是否长时间(100%)使用。在这种情况下,您可能希望提高数据库的定价层规模。
我建议您将其设置sqlBulkCopy.BatchSize
为合理的数量,而不是将所有内容批量插入。根据要插入的数据,尝试从10.000开始,然后上下移动,直到对性能满意为止。
编辑以获得更多说明:考虑批处理大小时,需要考虑SqlBulkCopy不仅需要插入数据,还需要读取并发送数据-最后一部分可能是其在本地运行的原因SQL Server,但是不在Azure上-这还意味着,如果要使用大型数据集,则需要使用较小的批处理大小或相当大的BulkCopyTimeout设置,以使每个批处理有机会在达到超时限制。
您可以在这篇文章中阅读有关批量大小的更多信息。 SqlBulkCopy的建议批处理大小是多少?
其他选择:
我正在阅读此书,这可能仅仅是因为您的插入内容达到了关键的DTU(数据库事务单元,基本上是对服务器组合资源的一种度量)使用点。
对性能级别进行了校准和控制,以提供所需的资源来运行数据库工作负载,直至达到所选服务层/性能级别所允许的最大限制。如果您的工作负载达到CPU /数据IO /日志IO限制之一的限制,您将继续以允许的最大级别接收资源,但是查询的等待时间可能会增加。这些限制不会导致任何错误,而只会导致您的工作负载减慢,除非该减慢变得如此严重以至于查询开始超时。
从此链接获取:https : //azure.microsoft.com/da-dk/blog/azure-sql-database-introduces-new-near-real-time-performance-metrics/
尝试在监视DTU的同时再次启动副本使用情况,并查看它是否长时间(100%)使用。在这种情况下,您可能希望提高数据库的定价层规模。