Pergunta

Escrevi uma função de replicação personalizada em um aplicativo Windows Forms C# padrão com um banco de dados SQL Server 2008 Express.Basicamente, ele extrai um conjunto de instruções SQL que precisam ser executadas em um banco de dados de assinantes.Em uma atualização completa, isso pode executar mais de 200 mil instruções que precisam ser executadas.

Estou processando essas instruções dentro de um bloco de código conforme mostrado abaixo:

using (SqlConnection connection = ConnectionManager.GetConnection())
{
     connection.Open();

     SqlTransaction transaction = connection.BeginTransaction();

     // Process 200k+ Insert/Update/Delete statements using SqlCommands

     transaction.Commit
}

O que estou descobrindo é que o uso de memória dos meus aplicativos permanece bastante estável em cerca de 40 MB para as primeiras 30 mil instruções.Depois disso, de repente, parece saltar para cerca de 300 MB e depois cresce até atingir uma exceção OutOfMemory.

O método que estou usando é possível? Posso processar tantas instruções dentro de uma única transação?Eu diria que deveria ser capaz de fazer isso.Se houver uma maneira melhor, eu adoraria aqui.Preciso que isso seja transacional, caso contrário, uma replicação parcial resultaria em um banco de dados quebrado.

Obrigado.

EDITAR:

Depois de reiniciar meu computador, consegui fazer uma replicação completa de mais de 200k.Mesmo que em determinado momento o uso de memória tenha aumentado para 1,4 Gb após a conclusão da replicação, o uso de memória caiu para 40 MB.O que me leva a concluir que algo dentro do meu loop que processa os comandos talvez esteja causando o crescimento da memória.

Foi útil?

Solução

Você é Disposing seus formulários e os controles descartáveis ​​antes de fechar?

Envolva todos os objetos descartáveis ​​na instrução Using.Clique aqui para mais detalhes


Não abra/feche a conexão repetidamente; em vez disso, envie os dados para o banco de dados em uma única transação.Clique aqui para mais detalhes


Ainda assim, seu aplicativo está armazenando muita memória, então você precisa de um médico como o Red Gate Ants Memory Profiler.Clique aqui para ver mais detalhes sobre o assunto

enter image description here


posso processar tantas instruções dentro de uma única transação?

Você tem opções abaixo para fazer isso ...

  1. Inserir e operar em massa os registros em Stored Proc.
  2. Preparar XML e envie a string Database.
  3. Envie o somente leitura DataTable no Sql Server através do Stored Proc

Amostra de processo armazenado

Begin Try
    Set NoCount ON
    Set XACT_Abort ON
    Begin TRan
        --Your queries
    Commit Tran

Begin Tran

Begin Catch
    Rollback Tran
End Catch

Tenha certeza de Dispose os objetos uma vez que não estão em uso.


Deveria ser assim

using (SqlConnection connection = new SqlConnection())
{
    connection.Open();
    using (SqlTransaction transaction = connection.BeginTransaction())
    {
        transaction.Commit();
    }
}

Você verificou o SqlCommand também?

using (SqlCommand cmd = new SqlCommand())
{
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top