2016-06-06 12 views
0

erschöpft Wenn Daten in der Datenbank einfügen parallel mit foreach bekomme ich folgende Fehlermeldung:Der Verbindungspool wurde

The connection pool has been exhausted'

nach einem gewissen Menge an Daten in die Datenbank

Einfügen
try 
{ 
    var connection = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 

    Parallel.ForEach(Enumerable.Range(0, 1000), (_) => 
    { 
     using (var connectio = new NpgsqlConnection(connection)) 
     { 
      connectio.Open(); 
      using (var command = new NpgsqlCommand("fn_tetsdata", connectio) { CommandType = CommandType.StoredProcedure }) 
      { 
       command.Parameters.AddWithValue("firstname", "test"); 
       command.Parameters.AddWithValue("lastname", "test"); 
       command.Parameters.AddWithValue("id", 10); 
       command.Parameters.AddWithValue("designation", "test"); 

       command.ExecuteNonQuery(); 
      } 
      connectio.Close(); 
     } 
    }); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
+1

Die Standardgröße des Verbindungspools ist 20, also entweder erhöhen oder die Anzahl der Verbindungen reduzieren. –

+2

Ich frage mich nur, warum du es so machen würdest ... Du erkennst, dass es normalerweise besser ist, eine Menge Arbeit in einem einzigen Stapel zu erledigen, anstatt viele Fäden zu werfen, die eine Verbindung herstellen, etwas Arbeit machen, trennen , etc? – atlaste

+0

Ich bin nicht davon überzeugt, dass die Standard-Pool-Größe ist 20 - http://StackOverflow.com/Questions/18943703/How-Many-Threads-parallel-forforeach-will-create-default-maxdegreeofparalleli –

Antwort

4

Constrain die Menge an paralelism mit MaxDegreeOfParallelism, standardmäßig könnte es die Anzahl der DB-Verbindungen überschreiten, die Sie haben. Finden Sie ein Gleichgewicht zwischen parallelisieren Ihrer Arbeit und nicht die DB zu töten :)

Parallel.ForEach(yourListOfStuff, 
    new ParallelOptions { MaxDegreeOfParallelism = 10 }, 
    stuff => { YourMethod(stuff); } 
); 
2

Ich nehme an, Sie verwenden Parallelität, um die Leistung zu verbessern. Wenn das der Fall ist, dann brauchen Sie zuerst eine Grundlinie. Führen Sie die 1.000 Abfragen seriell durch und erstellen Sie jedes Mal eine neue Verbindung (die in Wirklichkeit nur eine Verbindung aus dem Pool herstellt).

Dann versuchen Sie es mit dem gleichen Verbindungsobjekt und sehen, ob die Leistung verbessert.

Dann versuchen Sie es mit dem Befehl Objekt, nur die Parameterwerte ändern.

Dann versuchen Sie es parallel mit der gleichen Verbindung co Sie erstellen nicht 1.000 Verbindungsobjekte, die Sie bereits ausprobiert haben.

Ich wäre überrascht, wenn Sie mithilfe Parallelität eine signifikanten Leistungsverbesserung erhalten, da Parallel die Leistung von CPU-gebundenen Aufgaben verbessert und Datenabfragen werden von I/O als CPU im Allgemeinen viel mehr gebunden.

Verwandte Themen