Domanda

Il seguente codice esegue un semplice comando insert. Se viene chiamato 2000 volte consecutivamente (per inserire 2.000 righe) una OleDbException con messaggio = " Risorse di sistema superate " viene lanciato. C'è qualcos'altro che dovrei fare per liberare risorse?

using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}
È stato utile?

Soluzione

L'errore delle risorse di sistema superate non proviene dal codice gestito, viene da te che uccidi il tuo database (JET?)

Stai aprendo la strada a molte connessioni, in modo da digiunare ...

Alcuni consigli:

  • Evita i round trip non aprendo una nuova connessione per ogni singolo comando ed esegui gli inserimenti utilizzando una singola connessione.
  • Assicurati che il pool di connessioni al database funzioni (non sono sicuro che funzioni con le connessioni OLEDB).
  • Valuta l'utilizzo di un modo più ottimizzato per inserire i dati.

Hai provato questo?

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

Altri suggerimenti

Ho testato questo codice con un database di Access 2007 senza eccezioni (sono arrivato a 13000 inserti).

Tuttavia, ciò che ho notato è che è terribilmente lento poiché si sta creando una connessione ogni volta. Se inserisci " usando (connessione) " fuori dal giro, va molto più veloce.

Oltre a quanto sopra (connettersi al database una sola volta), vorrei anche assicurarmi di chiudere e smaltire le connessioni. Poiché la maggior parte degli oggetti in c # sono gestiti dalla memoria wrt, le connessioni e i flussi non hanno sempre questo lusso, quindi se oggetti come questo non vengono eliminati, non è garantito che vengano ripuliti. Ciò ha l'effetto aggiuntivo di lasciare quella connessione aperta per la vita del tuo programma.

Inoltre, se possibile, esaminerei l'utilizzo delle Transazioni. Non so per cosa stai usando questo codice, ma OleDbTransactions è utile quando si inseriscono e si aggiornano molte righe in un database.

Non sono sicuro dei dettagli, ma ho riscontrato un problema simile. Utilizziamo un database di Access con IIS per servire i nostri clienti. Non abbiamo molti client ma ci sono molte connessioni aperte e chiuse durante una singola sessione. Dopo circa una settimana di lavoro, riceviamo lo stesso errore e tutti i tentativi di connessione falliscono. Per correggere il problema, tutto ciò che dovevamo fare era riavviare i processi di lavoro.

Dopo alcune ricerche, ho scoperto (ovviamente) che Access non funziona bene in questo ambiente. Le risorse non vengono rilasciate correttamente e col tempo il file eseguibile si esaurirà. Per risolvere questo problema, passeremo a un database Oracle. Se ciò non risolve il problema, ti terrò aggiornato sui miei risultati.

Ciò potrebbe verificarsi perché non si elimina l'oggetto Connection and Command creato. Smaltisci sempre l'oggetto alla fine.

OledbCommand.Dispose();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top