Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird Connection Timeout beeinflussen (https://www.delphipraxis.net/162128-firebird-connection-timeout-beeinflussen.html)

ChrisE 8. Aug 2011 13:19

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC

Firebird Connection Timeout beeinflussen
 
Hallo,

irgendwie bekomme ich es nicht raus, wie ich den Connection-Timeout bei Firebird einstellen kann. Folgendes Problem:
Ein Verbindung soll hergestellt werden zu Server:serv/port mit User:ben und Passwort:pass von Client:A mit der FireBird-Emb-DLL und IBDAC.

Jetzt kann es sein, dass der Server an sich schon erreichbar ist (IP-Ping), aber der Dienst nicht erreichbar ist auf dem angegebene Port. Wird dann Connect aufgerufen, dauert es ca. 60 Sekunden bis der Timeout kommt. In dieser Zeit friert die Anwendung komplett ein. Das würde sich lösen lassen durch einen Thread der das Connect aufruft. Aber nichts desto trotz scheint mir die Dauer bis der Timeout kommt doch recht hoch. Ich möchte Sie gerne beeinflussen können.

Leider finde ich nichts dazu über google & Co.
Wenn ich die Verbindungsparameter anpassen möchte per
Delphi-Quellcode:
IBCConnection.Params.Add('connect_timeout=5');
, kommt nur not supported von IBDAC. Ich sehe, dass es diesen Parameter gibt (in der IBDAC-Deklaration) und das er korrekt geparst wird - dennoch wird er offensichtlich nicht unterstützt.
Generell würde mich aber interessieren, ob es hier überhaupt einen weg gibt, die Zeit zu beeinflussen oder zumindest zu testen, ob der Dienst da ist.

Gruß, Chris

Piethan 8. Aug 2011 13:37

AW: Firebird Connection Timeout beeinflussen
 
Hallo Chris,

schaue doch mal in der firebird.conf dort gibt es zwei Parameter.

Code:
#ConnectionTimeout = 180
Code:
#DeadlockTimeout = 10
Jedoch finde ich die Antwortzeit seltsam, tritt dies nur beim Lesen auf, dies kann ja schon mal sein, oder auch beim Schreiben?

Hast du eventuell einen schlechten Index, der beim Insert Zeit frisst? Ich hatte dieses Problem mal, weil einer der Gateways
(Stück Software zwischen DB und Software) zuwenig Speicher hatte und dort die Transaktionen aufliefen, aber auch ein
Neustart der Switch hatte mir mal geholfen. Bei mir liegt das Problem fast nie an der DB selber.

Prüfe doch mal ob noch Transaktionen offen sind!

Code:
execute block
returns
(
  Kind varchar(30),
  ID bigint,
  Time_Stamp timestamp,
  Data blob sub_type text,
  State integer
)
as
  declare userName varchar(256);
  declare dbName varchar(256);
  declare tid bigint;
  declare aid bigint;
begin
  for select
    mon$timestamp,
    mon$state,
    mon$transaction_id,
    mon$attachment_id
  from
    mon$transactions t
-- where
-- mon$transaction_id = t.mon$oldest_active
  order by
    case when mon$transaction_id = t.mon$oldest_active then
      0
    else
      1
    end,
    mon$transaction_id
  into
    :Time_Stamp, :State, :ID, :AID
  do
  begin
    Data = null;
    Kind = 'Transaction';
    suspend;
    TID = ID;

    for select
      trim(mon$remote_address)
      ||' -> '|| trim(mon$remote_process),
      mon$remote_pid,
      mon$user,
      mon$attachment_name
    from
      MON$ATTACHMENTS
    where
      mon$attachment_id = :AID
    into
      :Data, :ID, :userName, :dbName
    do
    begin
      State = null;
      Kind = 'Process';
      suspend;
     
      ID = null;
      Kind = 'Database';
      Data = dbName;
      suspend;
     
      Kind = 'User';
      Data = userName;
      suspend;
     
      Kind = 'Statement';
     
      for select
        mon$statement_id,
        mon$timestamp,
        mon$sql_text,
        mon$state
      from
        MON$STATEMENTS
      where
        mon$transaction_id = :tid
        and mon$attachment_id = :aid
      into
        :ID, :Time_Stamp, :Data, :State
      do
        suspend;
    end
  end
end
LG
Dirk

mschaefer 8. Aug 2011 13:39

AW: Firebird Connection Timeout beeinflussen
 
Vielleicht könntest Du den Port kurz ansprechen bevor Du die Verbindung zu FB aufmachst Link zu Portscanner

ChrisE 8. Aug 2011 13:55

AW: Firebird Connection Timeout beeinflussen
 
Hallo,

@Dirk:
nein, das hat nichts mit Antwortzeit bei einer bestehenden Verbindung zu tun. Das hat schlicht mit dem Verbindungsversuch (Connect) selber zu tun. Es besteht derzeit noch keine Verbindung. Diese soll erst aufgenommen werden. Und bei der aufnahme der Verbindung gibt es eben den Timeout, weil der Server / Dienst etc. nicht erreichbar ist.
Der Parameter
Code:
ConnectionTimeout = <WertInSekunden>
scheint nur zu beeinflussen, wann bei bestehender Verbindung als unterbrochen gilt. Er scheint nicht für den Verbindungsaufbau zu gelten :-(
Der Parameter
Code:
DeadlockTimeout = 10
war mir bisher nicht bekannt. Werd ich gleich mal nachschauen wofür der da ist.

@mschaefer:
Danke, dass werd ich mir gleich mal anschauen. Interessant wäre, aber ich dadurch nicht nur die Aussage erhalte ob ein Port offen ist, sondern auch ob man dort eine "Antwort" erhält. Das an sich dürfte schwierig werden, da ja jeder Dienst etc. hinter einem Port stehen könnte...

Gruß, Chris

kretabiker 8. Aug 2011 15:05

AW: Firebird Connection Timeout beeinflussen
 
Hallo ChrisE,

wie willst du dich mit der Datenbank verbinden? Wenn ich es richtig sehe, verwendest du Embedded, richtig? Da sind nur lokae Verbindungsprotokolle möglich, jedoch keine TCP/IP (auch nicht via localhost oder 127.0.0.1). Aus der Doku:

2.2. Database access

Client access can be only via the local protocol,
i.e. NOT a TCP/IP connection string that includes
the server name "localhost" or IP address 127.0.0.1.

The embedded server supports only the local connection
to a database file path without a server name.

Vielleicht liegt derin die Ursache?

Viele Grüße

Udo

ChrisE 8. Aug 2011 15:16

AW: Firebird Connection Timeout beeinflussen
 
Hallo Udo,

vielen Dank für den Hinweis - allerdings läuft auf dem "Server" der Firebird-Dienst und auf dem Client befindet siche keine FB-Installation. Auf dem Client werden die FB-Emb-Files mit ins Install-Verzeichnis der Software gepackt. Ich habe also keine direkte Verbindung zu einem DB-File sondern tatsächlich zu einem Dienst per TCP/IP.

Aber der Vorschlag von mschaefer bringt zumindest ein Workarround. Manchmal sieht man den Wald vor lauter Bäumen nicht :-) Eine einfache TCP-Verbindung zu Server:Port aufbauen und schauen ob es klappt oder nicht mit Timeout. Realisiert (für mich am einfachsten) mit einem Indy-TCPCLient :-)

Danke erstmal dafür.

Nichts desto trotz würde mich schon interessieren, ob man das nicht auch direkt mit der Firebird-DLL machen kann bzw. mit IBDAC? :gruebel:

Gruß, Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz