[ Milos D @ 02.02.2007. 15:23 ] @
Ako koristite IBO, tj. IB_Connection - da li ste uspeli da napravite program koji ce elegantno da se izbori sa realnim problemima pristupa udaljenoj bazi preko neta?

Konkretno ono sto meni smeta je:

A) kada pokusam da se povezem sa bazom na racunaru na kojem, na primer, nije dobro namesten firewall. To traje i traje i traje i tek onda podigne exception. Ima li negde da se namesti timeout od 10-ak sekundi na primer?

B) program je startovan, povezan sa bazom. Ako dodje do nekog problema u mrezi (npr. dial-up veza se prekine), program nema pojma da je veza sa bazom prekinuta. Tek kada pokusam da otvorim neki upit (na primer), dodje do exception-a. Postoji li neko elegantno auto-re-connect resenje?

Hvala unapred.
[ morlic @ 02.02.2007. 21:53 ] @
Problem mozes delimicno resiti na sledeci nacin:

U connection parametre komponente koja predstavlja konekciju na bazu pored obaveznih user_name i password mozes postaviti i

isc_dpb_connect_timeout
isc_dpb_dummy_packet_interval


Prva predstavlja timeout prilikom povezivanja (u sekundama), a druga predstavlja interval periodicnog slanja nazovimo test paketa kojima se testira veza, pa se na taj nacin moze ustanoviti prekid veze pre nego sto korisnik to inicira. Znaci

isc_dpb_connect_timeout=10
isc_dpb_dummy_packet_interval=60

Ovo nisam probao jer mi nije trebalo, default mi sasvim odgovara.

Tezi deo je kako da aplikaciju napravis otpornom na te prekide. Znaci moras predvideti da se prekid veze moze desiti bilo gde i bilo kada. Ja izmedju ostalog, posto intezivno koristim akcije (TActionList, TAction, itd.), prilikom update-a akcije ukljucujem i proveru konekcije na bazu, tako da interfejs trenutno reaguje na promene. Naravno, treba omogucti i pouzdan metod korisniku da izadje iz svake forme i na kraju iz programa u slucaju da nema konekcije. Znaci bez task manager-a ;)

Ima tu jos caka, interesuju me kako ostali resavaju ove probleme.
[ savkic @ 03.02.2007. 14:49 ] @
> Ja izmedju ostalog, posto intezivno koristim akcije (TActionList, TAction, itd.), prilikom update-a akcije ukljucujem i proveru konekcije na bazu,

> Ima tu jos caka, interesuju me kako ostali resavaju ove probleme.

Ja proveru radim kada mi zatreba nešto iz baze, npr. startovanje bilo koje transakcije prolazi kroz jednu metodu gde se prvo uspostavlja konekcija ako već nije. Dodat je i OnDisconnect event handler za db komponentu gde se diskonektuju ostali resursi, s tim što se ovaj event ne poziva uvek.
[ Milos D @ 04.02.2007. 11:50 ] @
Hvala na odgovorima. Sto se tice predugog connection timeout-a to je bila moja greska, default timeout je sasvim OK. I pored toga probao sam da se poigram sa isc_dpb_connect_timeout predlogom, koliko mogu da vidim to bi moralo da se odradi u OnCustomizeDPB eventu konekcije, npr. ovako:

Code:

procedure TForm1.OnCustomizeDPB(Sender: TIB_Connection; var ABufPtr: Integer; var ABuffer: array of Char);
begin
  BuildDPB(ABufPtr, ABuffer, isc_dpb_dummy_packet_interval, '50');
  BuildDPB(ABufPtr, ABuffer, isc_dpb_connect_timeout, '20');
end;


medjutim, ne vidim nikakvu razliku koliku god vrednost da stavim za isc_dpb_connect_timeout...


Osim toga, trenutno pokusavam sa ovim OnConnectionError kodom (tj. ovo je u nasledjenoj klasi):

Code:

procedure TIB_Connection_Plus.ConnectionError(Sender: TObject; const ERRCODE: Integer; ErrorMessage, ErrorCodes: TStringList;
                                              const SQLCODE: Integer; SQLMessage, SQL: TStringList; var RaiseException: Boolean);
begin
   if not Connected then exit;
   if (ERRCODE = IB_Header.isc_conn_lost) or (ERRCODE = IB_Header.isc_network_error) or (ERRCODE = IB_Header.isc_lost_db_connection)
    then
      begin
        try
          try
            ForceDisconnect;
          except
          end;
          Open;
          RaiseException := false;
        except
          ConnectionLost := true;
        end;
      end;
end;


Za upite koje kreiram dinamicki ovo je OK i gubitak konekcije se ne primecuje tj. reconnect se odradi lepo. Medjutim sa postojecim otvorenim IB_Query (na data modulu) je bilo problema jer nakon reconnect-a oni izgleda i dalje imaju stare hendlove... pa sam dodao i

Code:

procedure TIB_Connection_Plus.ForceDisconnect;
var i : integer;
begin
  for i:= 0 to self.DatasetCount-1 do
    begin
      Datasets[i].Close;
      Datasets[i].Unprepare;
    end;
  inherited ForceDisconnect;
end;


ali iz nekog razloga ostao je problem sa IB_Query.Params (parametri se obrisu) i Locate pa sam nasledio query i dodao

Code:

function TIB_Query_Plus.GetParam(index: integer): TIB_Column;
begin
  if ParamCount=0
    then begin
           UnPrepare;
           Prepare;
         end;
  result := inherited Params[index];
end;

function TIB_Query_Plus.Locate(const KeyFields: string; const KeyValues: Variant; Options: TIB_LocateOptions): Boolean;
begin
  if not Prepared then Prepare;
  result := inherited Locate (KeyFields, KeyValues, Options);
end;


potrebno je jos da se testira, ali za sada deluje ok...