ASP.NET Копирование записей из Excel в SQL Server — низкая производительность

#asp.net #sql-server #sqlbulkcopy

#asp.net #sql-сервер #sqlbulkcopy

Вопрос:

Я использую ASP.NET и SqlBulkCopy для копирования записей из файла Excel, который пользователь загружает на сайт, на Sql Server. Среднее количество строк составляет около 50. Я использую Windows Server 2016. Приведенный ниже код годами работал нормально, но в последнее время стал очень медленным и часто выходил из строя, и единственный способ исправить это — перезапустить IIS. Я хотел спросить, есть ли способ оптимизировать этот код или это может вызвать утечку памяти? Есть ли у вас какие-либо предложения о том, как это улучшить.. Спасибо

 Sub ImportFile(ByVal FileName As String)
    Try

        If fileuploadExcel.FileName <> "" Then
            Dim path = fileuploadExcel.PostedFile.FileName
            Dim tableName As String = "PCAReviews_Upload"
            Dim extension As String = System.IO.Path.GetExtension(fileuploadExcel.PostedFile.FileName)
            Dim excelConnectionString As String
            Dim conn As SqlConnection = New SqlConnection(connStr)

            excelConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:UsersFileUploads" amp; FileName amp; ";Extended Properties=Excel 8.0;Persist Security Info=False"
            
    Dim excelConnection As OleDbConnection = New OleDbConnection(excelConnectionString)
            conn.Open()

            Dim comm As SqlCommand = New SqlCommand("truncate table " amp; tableName, conn)
            Dim cmd As OleDbCommand = New OleDbCommand("SELECT Workgroup, [Last Name],  [First Name], [Titanium Number], [Phone Number], [Inbound-Outbound], [Date of the Call], [Time of the Call], [Duration of the Call], ID FROM [PCA_Sample_Temp$]", excelConnection)

            excelConnection.Open()

            Dim dr As OleDbDataReader
            dr = cmd.ExecuteReader()

            Dim sqlBulk As SqlBulkCopy = New SqlBulkCopy(connStr)

            'Set the destination table name
            sqlBulk.DestinationTableName = tableName
            sqlBulk.WriteToServer(dr)
            excelConnection.Close()
            excelConnection.Dispose()
            conn.Close()
            lblMessage.ForeColor = Drawing.Color.Green
            lblMessage.Text = "Import was successful!<br />"

        Else
            lblMessage.ForeColor = Drawing.Color.Red
            lblMessage.Text = "Please select Excel file to upload"
        End If
    Catch ex As Exception
        lblMessage.Text = ex.Message
        lblMessage.ForeColor = Drawing.Color.Red
    End Try

End Sub
  

Комментарии:

1. После перезапуска IIS производительность загрузки снова в порядке?

2. Да, после перезапуска IIS производительность снова становится быстрой / нормальной, но, похоже, через несколько дней снижается, а затем в конечном итоге полностью перестает работать. Под «не работает» я подразумеваю, что он вообще не будет копировать записи и просто вращается бесконечно. Спасибо

3. Отключен ли пул SqlConnection (в строке подключения)? является ли попытка выдавать какие-либо исключения? Предпочтительно, чтобы соединения находились внутри с использованием блоков learn.microsoft.com/en-us/dotnet/visual-basic/… Чтобы попытаться повысить производительность, для SqlBulkCopy используйте WriteToServerAsync вместо метода Sync learn.microsoft.com/en-us/dotnet/api /…

4. Существует ряд объектов, которые не очищаются / не удаляются (sqlBulk никогда не удаляется, соединения не удаляются в случае исключения). Я бы начал с этого в первую очередь. Кстати, команда TRUNCATE TABLE кажется избыточной, поскольку она не используется.

5. Небольшая побочная точка, но если количество строк, с которыми вы имеете дело, «низкое» (до 1000), то подход TVP может обеспечить лучшую производительность (не обязательно заметную в общей схеме вещей для небольших объемов, но вариант для меньших нагрузок, когда SqlBulkCopy на самом деле не нужен). Я подробно описал это в блоге здесь: sentryone.com/blog /. … Либо проблема в коде вашего приложения (отсюда мой предыдущий вопрос: перезапуск IIS, решающий его или нет, и первый шаг для обеспечения удаления объектов), либо в БД происходит некоторая блокировка