Ich verwende das Objekt IBM.Data.DB2.DB2DataAdapter, um mehrere Verbindungen zu verschiedenen Datenbanken auf verschiedenen Servern herzustellen.
Meine grundlegende Schleife und Verbindungsstruktur sieht wie folgt aus:DB2Connection-Objektschleife Öffnen und dann Speicherausnahmen schließen
foreach (MyDBObject db in allDBs)
{
//Database Call here for current DB...//Get SQL, then pass it to DB call
QueryCurrentDB(command);
}
Then ...
DB2Connection _connection;
Public DataTable QueryCurrentDB(DB2Command command)
{
_connection = new DB2Connection();
DB2DataAdapter adapter = new DB2DataAdapter();
_connection.ConnectionString = string.Format("Server={0};Database={1};UID={2};PWD={3};", _currentDB.DBServer, _currentDB.DBName, _currentDB.UserCode, _currentDB.Password);
command.CommandTimeout = 20;
command.Connection = _connection;
adapter.SelectCommand = command;
_connection.Open();
adapter.Fill(dataTable);
_connection.Close();
_connection.Dispose();
return dataTable;
}
Wenn ich etwa 20 oder so Datenbanken auf verschiedenen Servern habe ich diese Ausnahme schließlich am Ende immer. Ich kann die Speicherzuordnung für jede Datenbankinstanz auch nicht steuern.
FEHLER [57019] [IBM] SQL1084C Der Datenbankmanager konnte keinen freigegebenen Speicher zuordnen, da ein Betriebssystemkernelspeicherlimit erreicht wurde. SQLSTATE = 57019
Der einzige Weg, ich in der Lage gewesen, dies zu umgehen ist vor jedem DB-Aufruf einen Thread schlafen legen, wie zum Beispiel:
System.Threading.Thread.Sleep(3000);
ich hasse, würde irgendwelche Vorschläge geschätzt.
Der Code gibt kein klares Bild (der 'sqlCommand' übergeben wird nicht verwendet und wie/wo' _connection' erstellt wird, wird nicht angezeigt). Die Fehlermeldung weist jedoch nicht ausdrücklich auf DBConnection hin. DBProvider-Objekte müssen entsorgt werden und es sieht nicht so aus, als wären Sie es. – Plutonix
Ich habe den Code aktualisiert, um besser zu zeigen, wie ich die db2-Objekte verwende. – Airborne