Hallo Zusammen,
ich beobachte auf meinem FB4 Server mit diesem Statement
Code:
select
att.mon$user,
att.mon$remote_address,
stmt.mon$sql_text,
stmt.mon$stat_id,
cast(stmt.mon$timestamp as timestamp)
from mon$attachments att
join mon$statements stmt on att.mon$attachment_id = stmt.mon$attachment_id
where
att.mon$attachment_id <> current_connection
and
stmt.mon$state in (0, 1, 2)
die Zugriffe. Infos dazu sind
hier zu finden.
In meiner Anwendung verwende ich SQLExpress Komponenten (TSQLConnection und TSQLDataSet).
Der typische Ablauf (Pseydocod - nur prinzipiell) ist dann:
Delphi-Quellcode:
SQLDS : TRMSQLDataSet;
.
.
SQLDS.Active := False; //
SQLDS.Prepared := False; // ist eigentlich unötig, hier nur zur Information
SQLDS.CommandText := 'select xyz from table'; // nur Beispiel
SQLDS.Prepared := True;
SQLDS.Active := True;
... Daten werden weiter verarbeitet, dann:
SQLDS.Active := False;
SQLDS.Prepared := False;
Nun bemerke ich, dass z.B. das o.g. Statements in dieser Liste der Statements verbleiben ist, es hat mon$state = 0.
Hier ein Auszug aus der
FB Doku:
Code:
MON$STATE SMALLINT Statement state: 0 - idle 1 - active 2 - stalled
Das Statement verschwindet erst, wenn die
DB Verbindung von meiner Anwendung geschlossen wird.
Aktuell möchte ich wenn möglich vermeiden, dass meine Anwendung nach jeder
DB Abfrage die Verbindung schließt und ggf. für die nächste Abfrage neu aufbaut.
Die Standardeinstellung der Transaktion ist
Code:
TransIsolation=ReadCommited
(wird in TSQLConnection eingestellt).
Wird beim
DB-Abruf aus meiner Anwendung nun z.B. eine Stored Procedure angestprochen, so kann diese nicht neu kompiliert werden.
Ich vermute, weil das Statement in
aufgeführt ist.
Kann mir jemand erklären, warum die Statements trotz beendetem Abruf in
bleiben und vielleicht hat sogar jemand eine Idee, wie ich das ändern kann?
Danke für Tipps und Hilfe.
Gruß
Markus