Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

firebird, ibobjects - kako napraviti "robustan" program

[es] :: Pascal / Delphi / Kylix :: firebird, ibobjects - kako napraviti "robustan" program

[ Pregleda: 3418 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milos D
Beograd

Član broj: 5621
Poruke: 280
*.adsl-1.sezampro.yu.



+1 Profil

icon firebird, ibobjects - kako napraviti "robustan" program02.02.2007. u 15:23 - pre 209 meseci
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.
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.dynamic.sbb.co.yu.



+1 Profil

icon Re: firebird, ibobjects - kako napraviti "robustan" program02.02.2007. u 21:53 - pre 209 meseci
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.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: firebird, ibobjects - kako napraviti "robustan" program03.02.2007. u 14:49 - pre 209 meseci
> 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.
 
Odgovor na temu

Milos D
Beograd

Član broj: 5621
Poruke: 280
212.200.218.*



+1 Profil

icon Re: firebird, ibobjects - kako napraviti "robustan" program04.02.2007. u 11:50 - pre 209 meseci
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...
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: firebird, ibobjects - kako napraviti "robustan" program

[ Pregleda: 3418 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.