OleDbException Sistema de Recursos excedido
-
03-07-2019 - |
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();
}
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();