2009-05-18 14 views
3

Ich arbeite an allen Anwendungen, die mehrere Threads verwenden, die auf eine SQL Server 2005 db zugreifen, ich verwende derzeit implizite Verbindungen durch Einrichten der Verbindungszeichenfolge Eigenschaft des TADOQuery-Objekts, aber das scheint eine Menge zu öffnen Verbindungen zur Datenbank Wir müssen die Anzahl der Verbindungen zu reduzieren, die eine einzelne Instanz offen hält, soTADoConnection und Pooling

  1. gibt es irgendeine Art von Verbindung in TADOConnection Bibliothek zur Verfügung Bündelung und wie kann ich es ermöglichen, und setzen Sie ihn begrenzt.
  2. Wenn nicht, dann ist die empfohlene Methode zur Reduzierung und Wiederverwendung von Verbindungen zur Datenbank, so dass die Anwendung gut skaliert.

ich irgendwelche Meinungen oder Gedanken schätzen würde ..

vielen Dank

+0

Versuchen Sie, MultipleActiveResultSets = True in Ihre Verbindungszeichenfolge einzufügen. Hinzufügen als Kommentar, weil ich nicht sicher bin, ob es in Delphi funktioniert. –

+0

Wenn ich mich nicht irre, ist dies der Hauptzweck der 'TADOConnection'-Komponente, Ihre Datenbankverbindungen an einem Ort zusammenzufassen, anstatt mehrere' TADOQuery'-Komponenten mit ihren eigenen Verbindungen zu erstellen. Die Antworten beschreiben jedoch einige seltsame Vorgänge von ADO. –

Antwort

3

Standardmäßig werden ADO-Datenbankverbindungen zu SQL Server ohne Arbeitsaufwand zusammengefasst. Das Pooling-Verhalten kann durch Ihre Verbindungszeichenfolge geändert werden. Wie sieht Ihre Verbindungszeichenfolge aus?

Halten Sie Ihre Verbindungszeichenfolge genau gleich und erstellen/befreien Sie eine ADO-Verbindung in Ihrem Thread und lassen Sie die ADO-Laufzeit das Pooling behandeln. Die Anzahl der Verbindungen pro Prozess entspricht normalerweise der maximalen Anzahl "neuer" gleichzeitiger Verbindungen plus ein paar für einen Puffer.

+0

Ich weiß, dass ado.net standardmäßig das Verbindungs-Pooling durchführt, aber tut TADOConnection von Delphi das auch?, Haben Sie Links zu irgendwelchen zugehörigen Dokumentationen? –

+0

TADOConnection ist Borland/CodeGear Wrapping von Microsoft OLEDB-Schnittstellen. Hier ist ein Link http://blogs.msdn.com/selvar/archive/2007/11/10/ole-db-resource-pooling.aspx. Wenn du auf ADODB schaust, wirst du sehen, dass Borland dies getan hat. Sie könnten die Typelibs selbst importieren und direkt gehen, aber es ist viel einfacher, TADOxxx-Komponenten zu verwenden. –

1

Einstellen der TADOConnection Komponente auf dem Datenmodul und die Verwendung dieser von allen anderen ADO-Komponenten auf dem Datenmodul bereits eine Menge der Verringerung sollten Verbindungen. Wenn die Anwendung eine große Anzahl von Datamodulen verwendet, ist es möglich, dass diese Datamodule zur Laufzeit dieselbe Verbindung verwenden.

+0

in meinem Fall würden mehrere Threads auf das Datamodul zugreifen, würde tadoconnection mehrere Abfragen gleichzeitig öffnen? –

+0

Wenn Sie ein Datamodul aus Threads verwenden möchten, wäre es sinnvoll, eine Instanz des Datamoduls im Thread zu erstellen und zu zerstören, sodass jeder Thread über ein eigenes Datamodul verfügt. Dann sind Sie sicher, dass Sie pro Thread eine Verbindung haben, und dass Werte in Parametern und Feldern keine Konflikte zwischen Threads verursachen. –

+0

Diese Option reduziert nur die Anzahl der Verbindungen zu einer pro Thread statt einer pro Abfrage. Wenn die meisten Ihrer Threads nur eine einzige Abfrage enthalten, bietet dies keinen großen Vorteil. – skamradt

4

Ein weiterer Grund für die erhöhte Anzahl von Verbindungen sind mehrere offene Abfragen, die für dieselbe Verbindung aktiv sind.

Sagen Sie bitte Code wie

db := TAdoConnection.Create() 
qry1 := TAdoQuery.Create(); 
qry2 := TAdoQuery.Create(); 

qry1.connection := db; 
qry2.connection := db; 

qry1.SQL.Text := 'select * from whatever'; 

qry1.open; 
while not qry1.eof do 
begin 
    x := qry1.fieldbyname('fld').AsString; 
    qry2.SQL.Text := 'select * from elsewhere where SomeField='+ QuotedStr(x); 
    qry2.Open; 
    ..do something.. 
    qry2.Close; 

    qry1.Next; 
end; 

Die qry2.Open() verursacht haben eine andere Verbindung erstellt werden, die nicht gebündelt

Wenn Sie Code wie diesen haben, speichern Sie die Ergebnisse der qry1 zu einem lokalen Ort und dann die Arbeit von Qry2. In diesem Fall behalten Sie nur eine Verbindung bei.

In groben Zügen sieht das eher wie:

db := TAdoConnection.Create() 
qry1 := TAdoQuery.Create(); 
qry2 := TAdoQuery.Create(); 
str := TStringList.Create(); 

qry1.connection := db; 
qry2.connection := db; 

qry1.SQL.Text := 'select * from whatever'; 

qry1.open; 
while not qry1.eof do 
begin 
    x := qry1.fieldbyname('fld').AsString; 
    str.Add(x); 
    qry1.Next; 
end; 
qry1.Close; 

for i := 0 to str.Count-1 do 
begin 
    qry2.SQL.Text := 'select * from elsewhere where SomeField='+ QuotedStr(str[i]); 
    qry2.Open; 
    ..do something.. 
    qry2.Close; 
end 
1

Microsoft sagt: "... OLE DB-Ressource Pooling zu deaktivieren, die ADO verwendet standardmäßig ... Sie durch Hinzufügen tun können" OLE DB Services = -2 "zum ADO Connection String". Hier

ist der Link: http://support.microsoft.com/kb/229564

Es ist sehr nützlich, wenn eine Client-Anwendung eine Anwendungsrolle verwendet.