Pergunta

O código a seguir executa uma simples inserção de comando. Se ele é chamado de 2.000 vezes consecutivamente (para inserir 2.000 linhas) um OleDbException com mensagem = "Recursos do sistema excedido" é lançada. Há outra coisa que eu deveria estar fazendo para liberar recursos?

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
Foi útil?

Solução

O erro recursos do sistema ultrapassado não é proveniente do código gerenciado, o seu vindo de você matar o seu banco de dados (JET?)

Você está abrindo caminho para muitas conexões, maneira de rápido ...

Algumas dicas:

  • Evite roundtrips por não abrir uma nova conexão para cada comando único, e executar as inserções usando uma única conexão.
  • Certifique-se que o pool de conexões de banco de dados está trabalhando (Não tenho certeza se isso funciona com conexões OLEDB).
  • Considere o uso de uma forma mais otimizada para inserir os dados.

Você já tentou isso?

using (OleDBConnection conn = new OleDBConnection(connstr))
{
    while (IHaveData)
    {
        using (OldDBCommand cmd = new OldDBCommand())
        {
            cmd.Connection = conn;
            cmd.ExecuteScalar();
        }
    }
}

Outras dicas

Eu testei este código com um banco de dados Access 2007 sem exceções (eu fui tão alto quanto 13.000 inserções).

No entanto, o que eu notei é que é terrivelmente lento como você está criando uma conexão de cada vez. Se você colocar o "usando (conexão)" fora do loop, ele vai muito mais rápido.

Além do acima (a conexão com o banco de dados apenas uma vez), eu também gostaria de ter certeza de que você está fechando e eliminação de suas conexões. Como a maioria dos objetos em C # são geridos wrt memória, conexões e fluxos não tem esse luxo sempre, por isso, se os objetos como este não são eliminados, eles não são garantidos para ser limpo. Isto tem o efeito adicional de deixar que abrir conexão para a vida do seu programa.

Além disso, se possível, eu olhar para o uso de transações. Eu não posso dizer o que você está usando este código para, mas OleDbTransactions são úteis quando inserir e atualizar muitas linhas em um banco de dados.

Não estou certo sobre os detalhes, mas eu tenho deparei com um problema semelhante. Nós utilizamos um banco de dados Access com o IIS para servir os nossos clientes. Não temos muitos clientes, mas há um monte de conexões sendo aberta e fechada durante uma única sessão. Após cerca de uma semana de trabalho, receber o mesmo erro e todas as tentativas de conexão falhar. Para corrigir o problema, todos nós tivemos que fazer era reiniciar os processos de trabalho.

Depois de alguma pesquisa, descobri (é claro) que o Access não funciona bem neste ambiente. Recursos não são liberados corretamente e ao longo do tempo o executável vai acabar. Para resolver este problema, vamos passar para um banco de dados Oracle. Se isso não resolver o problema, eu vou mantê-lo atualizado sobre os meus resultados.

Isto poderia estar ocorrendo porque você não está dispondo a conexão e objeto de comando criado. Sempre descarte o objeto no final.

OledbCommand.Dispose();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top