TPQConnection erstellt 2. Verbindung

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

TPQConnection erstellt 2. Verbindung

Beitrag von Michl »

Hallo allerseits,

ich nutze eine PostgreSQL-Datenbank und habe damit ein Problem mit der TPQConnection. Sie bzw. das TSQLQuery erstellt eine zweite Verbindung, die beim Disconnecten nicht mit frei gegeben wird. Also am besten erklärt mit Code:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ZConnection1.Connected then begin
    ZQuery1.Active:=False;
    ZConnection1.Connected:=False;
  end else begin
    ZConnection1.Connected:=True;
    ZQuery1.Active:=True;
  end;
end; 
nutze ich die Zeos-Komponenten funktioniert das einwandfrei. D.h. 1 Verbindung wird beim Buttonklick erstellt, beim nächsten Klick wieder freigegeben.

Stelle ich den Code auf die Lazarus-Komponenten um, wird bei jedem TSQLQuery-aktivieren immer eine Verbindung mehr erstellt.
Ausprobiert habe ich nur die TPQConnection zu connecten und disconnecten, dies geht (1 Verbindung wird erstellt, 1 Verbindung wird freigegeben). Sobald ich aber TSQLQuery aktiviere, wird eine 2. Verbindung erstellt, die beim deaktivieren nicht wieder freigegeben wird.

folgendes habe ich ausprobiert

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  if PQConnection1.Connected then begin
    SQLQuery1.Active:=False;
    SQLQuery1.Close;
    SQLQuery1.Destroy;
    SQLQuery1.Free;
    PQConnection1.CloseDataSets;
    PQConnection1.CloseTransactions;
    PQConnection1.Connected:=False;
    PQConnection1.Close;
    PQConnection1.Free;
  end else begin
    PQConnection1.Connected:=True;
    SQLQuery1.Active:=True;
  end;
end; 
alles ohne Erfolg, die Verbindung, die beim PQConnection.connected erstellt wurde, wird gelöscht, die Verbindung, die beim aktivieren der SQLQuery erstellt wurde nicht (PS. ich weiss, dass ich aufgrund ".free" nur einmal disconnecten kann).

Hat jemand eine Idee, wie ich die Verbindung weg bekommen könnte?

Wie gesagt, das gleiche mit Zeos funktioniert (bin ja ein großer Fan von Zeos, würde aber gern auch die Alternativen verstehen). Warum das Ganze, da ich sonst Probleme mit einem BackUp habe, siehe mein Post im PG-Forum

[Edit] habe mal die Frage im englischen Forum gestellt: http://forum.lazarus.freepascal.org/ind ... 080.0.html

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TPQConnection erstellt 2. Verbindung

Beitrag von Michl »

Ist ein Fehler in der TPQConnection gewesen und lt. Aussage vor 2 Tagen behoben wurden. :)

Das wollte ich testen, bekomme zwar Lazarus (lazarus-1.3-42906-20130921-src.zip) mit dem neuem FPC gebaut, beim kompilieren eines eigenen Projekts bricht der Compiler mit einer Unmenge an meinen Horizont übersteigenden Fehlern ab. Werd da wohl für einen Test auf einen Snapshot warten müssen :(

Das Problem sollte dann aber in der Zukunft gelöst sein... :)

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: TPQConnection erstellt 2. Verbindung

Beitrag von Patito »

Ich hab den Fix auch gesehen. TPQConnection hat intern einen Pool von Connections, der nicht ganz sauber aufgeräumt wurde.
Normalerweise killt die Datenbank wohl solche Connections dann irgendwann über einen Timeout.
Vermutlich braucht man so einen Pool wenn man mehrere Transaktionen gleichzeitig auf einer Connection haben will (Unsinn?!).
Für mich klingt das vom Design her etwas fragwürdig - eine Connection ist eine Connection und kein Pool.
Wenn man einen Pool hat, rennen doch manche Connections im Pool sicher in Timeouts - so dass man damit einfach
nur mehr Ärger hat.

Zeos ist zur Zeit wohl die bessere Alternative. Zur Not könnte man es noch mit TODBCConnection probieren.

Antworten