Frage

Der folgende Code führt einen einfachen Befehl insert. Wenn es 2000 mal hintereinander aufgerufen wird (zum Einfügen von 2.000 Zeilen) eine OleDbException mit message = „Systemressourcen überschritten“ ausgelöst. Gibt es etwas, das ich soll zu befreien Ressourcen tun?

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

Lösung

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

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

Einige Tipps:

  • Vermeiden von Rundreisen nicht eine neue Verbindung für jeden einzelnen Befehl zu öffnen, und führen Sie die Einsätze eine einzige Verbindung.
  • Stellen Sie sicher, dass die Datenbankverbindung Pooling arbeitet (nicht sicher, ob das funktioniert mit OLEDB-Verbindungen).
  • Betrachten wir eine optimierte Art und Weise unter Verwendung der Daten einzufügen.

Haben Sie versucht das?

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

Andere Tipps

ich diesen Code testete mit einer Access 2007-Datenbank ohne Ausnahmen (Ich ging so hoch wie 13000 Einsätze).

Doch was mir aufgefallen ist, dass er schrecklich langsam ist, wie Sie eine Verbindung zu schaffen, jedes Mal. Wenn Sie die „verwenden (Verbindung)“ setzen außerhalb der Schleife, geht es viel schneller.

Zusätzlich zu dem oben (die Verbindung zur Datenbank nur einmal), würde Ich mag auch sicherstellen, dass Sie schließen und die Entsorgung Ihrer Verbindungen. Da die meisten Objekte in c # WRT Speicher verwaltet werden, Verbindungen und Bäche diesen Luxus nicht immer, also, wenn Objekte wie diese nicht entsorgt werden, werden sie nicht bereinigt werden garantiert. Dies hat den zusätzlichen Effekt, dass die Verbindung offen für das Leben Ihres Programms zu verlassen.

Auch, wenn möglich, würde ich schauen in Transaktionen verwenden. Ich kann nicht sagen, was Sie diesen Code verwenden für, aber OleDbTransactions nützlich sind beim Einsetzen und viele Zeilen in einer Datenbank zu aktualisieren.

Ich bin nicht sicher über die Besonderheiten, aber ich habe über ein ähnliches Problem läuft. Wir verwenden eine Access-Datenbank mit IIS zu unseren Kunden zu dienen. Wir haben nicht sehr viele Kunden, aber es gibt eine Menge von Verbindungen, die während einer einzigen Sitzung geöffnet und geschlossen. Nach etwa einer Woche der Arbeit, empfangen wir die gleichen Fehler und alle Verbindungsversuche scheitern. Um das Problem zu beheben, alles, was wir tun mussten, war die Arbeitsprozesse neu zu starten.

Nach einigen Recherchen fand ich (natürlich), dass Access keine gute Leistung in diesem Umfeld. Ressourcen werden nicht korrekt und im Laufe der Zeit veröffentlichen die ausführbare Datei wird auslaufen. Um dieses Problem zu lösen, werden wir zu einer Oracle-Datenbank verschieben. Wenn dies das Problem nicht beheben, werde ich Sie auf meine Erkenntnisse aktualisiert halten.

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

OledbCommand.Dispose();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top