2008-10-01 15 views
7

Der folgende Code führt einen einfachen Befehl zum Einfügen aus. Wenn es 2.000 Mal hintereinander aufgerufen wird (um 2.000 Zeilen einzufügen), wird eine OleDbException mit Meldung = "Systemressourcen überschritten" ausgelöst. Gibt es noch etwas, was ich tun sollte, um Ressourcen freizusetzen?OleDbException Systemressourcen überschritten

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

Antwort

5

Die Systemressourcen überschritten Fehler kommt nicht vom verwalteten Code, seine von Ihnen kommt Ihre Datenbank zu töten (JET?)

Sie öffnen Art und Weise zu viele Verbindungen, viel zu schnell ...

Einige Tipps:

  • vermeiden Rundreisen durch keine neue Verbindung für jeden einzelnen Befehl zu öffnen, und führen Sie die Einsätze eine einzige Verbindung.
  • Stellen Sie sicher, dass das Datenbankverbindungspooling funktioniert (nicht sicher, ob das mit OLEDB-Verbindungen funktioniert).
  • Verwenden Sie eine optimierte Methode zum Einfügen der Daten.

Haben Sie versucht das?

+0

Ich hatte ein ähnliches Problem, und das Verschieben der 'using()' -Anweisung außerhalb der Schleife wurde nicht nur die Ausnahme los, sondern erhöhte die Geschwindigkeit drastisch. Vielen Dank. –

1

Ich habe diesen Code mit einer Access 2007-Datenbank ohne Ausnahmen getestet (ich ging so hoch wie 13000 Einfügungen).

Was aber bemerkte ich, ist, dass es schrecklich langsam ist, wie Sie jedes Mal eine Verbindung schaffen. Wenn Sie "using (connection)" außerhalb der Schleife platzieren, geht es viel schneller.

0

Zusätzlich zu dem oben (die Verbindung zur Datenbank nur einmal), würde ich auch sicher machen wie Sie schließen und die Entsorgung Ihrer Verbindungen. Da die meisten Objekte in C# im Speicher verwaltet werden, haben Verbindungen und Streams diesen Luxus nicht immer. Wenn also solche Objekte nicht entsorgt werden, ist es nicht garantiert, dass sie bereinigt werden. Dies hat den zusätzlichen Effekt, dass diese Verbindung für die Lebensdauer Ihres Programms geöffnet bleibt. Auch

, wenn möglich, würde ich schauen in Transaktionen verwenden. Ich kann nicht sagen, wofür Sie diesen Code verwenden, aber OleDbTransactions sind nützlich, wenn Sie viele Zeilen in einer Datenbank einfügen und aktualisieren.

+0

der "using" -Befehl entsorgt die erstellten Verbindungen –

0

Ich bin mir nicht sicher über die Besonderheiten, aber ich bin über ein ähnliches Problem gestolpert. Wir verwenden eine Access-Datenbank mit IIS, um unsere Kunden zu bedienen. Wir haben nicht sehr viele Kunden, aber es gibt viele Verbindungen, die während einer einzelnen Sitzung geöffnet und geschlossen werden. Nach ungefähr einer Woche Arbeit erhalten wir den gleichen Fehler und alle Verbindungsversuche scheitern. Um das Problem zu beheben, mussten wir lediglich die Worker-Prozesse neu starten.

Nach einigen Recherchen fand ich (natürlich), dass Access in dieser Umgebung nicht gut durchführen. Ressourcen werden nicht korrekt freigegeben und im Laufe der Zeit wird die ausführbare Datei beendet. Um dieses Problem zu lösen, werden wir in eine Oracle-Datenbank wechseln. Wenn das Problem dadurch nicht behoben wird, werde ich Sie über meine Ergebnisse auf dem Laufenden halten.

+0

Haben Sie eine Quelle, um dies zu untermauern? – Ian

+0

Ich kann mich nicht an meine Quellen erinnern, es war zu lange. Aber an vielen Stellen im Netz habe ich viele Kommentare gefunden, dass dieses Problem existiert. Entschuldigung, ich habe keine weiteren Informationen. – Krucible

-1

Dies könnte auftreten, weil Sie nicht die Verbindung und Command-Objekt erstellt werden, zu entsorgen. Immer das Objekt am Ende entsorgen.

+1

Nach dem Verlassen des Bereichs "Verwenden" wird das Objekt entsorgt. So funktioniert das "using" – MikkaRin