2010-07-16 9 views
6

Ich habe eine TCPip-Server-Anwendung erstellt. Die Anwendung hat eine globale TADOConnection. Diese globale Ado-Verbindung wird sowohl für Hauptthreadabfragen als auch für Threads verwendet.Ok, TADOConnection in Threads zu verwenden

Ist das ok? Verfügt die ADOConnection über integrierte Mechanismen, um mehrere Abfragen gleichzeitig zu verarbeiten?

Meine Anwendung funktioniert in Testumgebungen (2-5 Verbindungen). Aber in einer Produktionsumgebung implementiert bekomme ich "unerklärliche" Zugriffsverletzungen zu dem Zeitpunkt, an dem die TADOQuery, die mit der ADOConnection verknüpft ist, auf geöffnet gesetzt ist.

Sollte ich ADOConnection verwenden oder sollten alle Abfragen nur die Verbindung zur Datenbank herstellen (was wahrscheinlich ein wenig teurer ist)?

+2

Duplikat von http://StackOverflow.com/Questions/1241844/ISDELDIFIS-TADOCONNECTION-Thread-Safe – jasonpenny

+1

Ressourcennutzung und Verbindungsinitialisierungszeit kann mithilfe eines Verbindungspools verbessert werden. Zum Beispiel basierend auf der Demo-Anwendung (en) in der OmniThreadLibrary (benötigt Delphi 2007 oder neuer) unter http://otl.17slon.com/ – mjn

+0

Danke - wird dies überprüfen. Aber zuerst werde ich das Ding los- dann kann ich mir Sorgen um die Leistung machen. –

Antwort

8

Jeder Thread seine eigene Verbindung Objekt haben muss. Der folgende Link bietet weitere Informationen: http://delphi.about.com/od/kbthread/a/query_threading.htm

Einige der wichtigsten Punkte aus dem Artikel:

1] CoInitialize und CoUninitialize müssen manuell aufgerufen werden, bevor eine der dbGo Objekte verwenden. Wenn CoInitialize nicht aufgerufen wird, wird die Ausnahme "CoInitialize wurde nicht aufgerufen" angezeigt. Die CoInitialize-Methode initialisiert die COM-Bibliothek für den aktuellen Thread. ADO ist COM.

2] Sie kann nicht verwenden Sie das TADOConnection-Objekt aus dem Haupt-Thread (Anwendung). Jeder Thread muss eine eigene Datenbankverbindung erstellen.

+0

Danke. Und ich glaube sogar, dass ich diesen Artikel auch gelesen habe. Ich werde daran arbeiten, es neu zu schreiben. Eine Sache jedoch: Ich bekomme nie die Ausnahme "Coinitialize wurde nicht genannt". Stattdessen erhalte ich Zugriffsverletzungen. Kann diese Ausnahme "still" sein? –

+0

Folgen Sie diesem. Wird die Anwendung "in Ordnung" ausgeführt, solange zwei Abfragen niemals gleichzeitig ausgeführt werden? Und stürzen nur bei simultanen Verbindungen ab? –

+0

Sorry für die Verspätung, war für eine Weile weg. Entschuldigung, ich kann Ihnen bei keinem Ihrer Kommentare helfen. Ich habe immer die Ausnahme "Coinilialize wurde nicht angerufen" erhalten und den Anruf erledigt. In Bezug auf mehrere Abfragen hatte ich noch nie ein Problem, aber ich vermute, dass, wenn mehrere Anrufe zur gleichen Zeit stattfanden, Probleme auftreten können, aber ich kann nicht sicher sagen. Danke auch für die Rep-Punkte. Ich bin immer noch ein Anfänger in diesem Community-Kram ... –

7

@M Schenkel, siehe diese Frage Is Delphi’s TADOConnection thread-safe?. Jeder Thread benötigt eine eigene Verbindung, da ADO eine COM-basierte Technologie ist und Apartment-Thread-Objekte verwendet.

sehen diese Probe

procedure TMyThread.Execute; 
begin 
    CoInitialize(nil); 
    try 
    try 
     // create a connection here 
    except 
    end; 
    finally 
    CoUnInitialize; 
    end; 
end; 
+0

Vielen Dank. Es scheint, dass Sie und Vic Adams im Wesentlichen die gleiche Antwort zur gleichen Zeit geschrieben haben. Da es keine Möglichkeit gibt, Stimmen zu "teilen", dachte ich, es wäre schön, Vic (nur 31 Reputationspunkte) die Stimme zu geben. Ich hoffe, Sie nehmen davon keine Ausnahme. –