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

Kad TDatabase izgubi vezu sa bazom, kako je vratiti?

[es] :: Pascal / Delphi / Kylix :: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?

[ Pregleda: 2296 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

DjGoran

Član broj: 123946
Poruke: 30



Profil

icon Kad TDatabase izgubi vezu sa bazom, kako je vratiti?01.09.2007. u 22:05 - pre 202 meseci
Učim Delphi već nekoliko dana. Napravio sam program koji pristupa bazi (preko mreže) svakih 0.2 sekunde, i ukoliko se pojavi novi zapis onda odradi šta treba i upiše neke stvari u bazu.

Pristupam preko TDataSoruce -> TQuery -> TDatabase -> ODBC 3.51 -> (LAN) -> MySQL 5.0.37

Sve radi savršeno, sem jedne sitnice: Kada prekinem mrežu na nekoliko sekundi, dobijam nekoliko poruka sa greškom (jedna za drugom), i nakon toga program više ne može da proradi. Spojim mrežu nazad, ali uporno se ponavljaju druga i treća poruka. Moram da restartujem program da bi proradila veza sa bazom.


Na koji način da se veza uspostavi opet? Da li postoji neki "automatski" način, ili bih morao da pišem kod koji proverava vezu sa bazom pa je "ručno" upostavlja ukoliko je izgubljena. Kako?









Code:

//Poruke dolaze iz ovog dela:

procedure DbiError(ErrorCode: DBIResult);
begin
  raise EDBEngineError.Create(ErrorCode);
end;


Code:

//Moj kod za pristup bazi je ovakav:

procedure Sel (obj: TQuery; sqlupit: string);
//sprovodi SQL upit koji ima odgovor (SELECT, i slicno)
    begin
        obj.Active := false;
        obj.Sql.Clear;
        obj.Sql.Text := sqlupit;
        obj.Active := true;
     end;


procedure Del (obj: TQuery; sqlupit: string);
//sprovodi SQL upit koji nema odgovor (DELETE, INSERT, i slicno)
    begin
        obj.Sql.Clear;
        obj.Sql.Text := sqlupit;
        obj.ExecSQL;
     end;





[Ovu poruku je menjao DjGoran dana 01.09.2007. u 23:16 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.dial-up.siol.net.

ICQ: 174153511


+26 Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?01.09.2007. u 23:38 - pre 202 meseci
Citat:
DjGoran: Učim Delphi već nekoliko dana. Napravio sam program koji pristupa bazi (preko mreže) svakih 0.2 sekunde, i ukoliko se pojavi novi zapis onda odradi šta treba i upiše neke stvari u bazu.

Pristupam preko TDataSoruce -> TQuery -> TDatabase -> ODBC 3.51 -> (LAN) -> MySQL 5.0.37


evo, opet :)

ako već koristiš MySql, probaj ovo, jako dobro, veoma brzo i free rešenje
http://zeos.firmos.at/portal.php

zaboravi TDatabase ............ jer tehnologija napreduje

druga stvar, upit na svake 0.2 sekunde zaboravi
em zagušuješ mrežu, em opterećuješ aplikaciju,


 
Odgovor na temu

DjGoran

Član broj: 123946
Poruke: 30



Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?02.09.2007. u 08:00 - pre 202 meseci
Hvala na onom linku, pogledaću. Ali bih ipak voleo da saznam rešenje za TDatabase, pošto sam sa njim počeo i voleo bih da ga apsolviram pre nego što odem dalje.

Inače, upiti svake 0.2 sekunde ne opterećuju ni aplikaciju, ni MySQL server, a čak ni mrežu. Naročito zato što tabela koju prozivam svakih 0.2 sekunde ima maksimalno do 30 zapisa (a uglavnom samo nekoliko) a upit vraća samo do nekoliko zapisa (a uglavnom jedan), tako da nema nikakvih problema niti opterećenja i ako je prozivam konstantno svake milisekunde (probao sam) a kamoli kada pravim pauzu od čak 200ms.
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.com
Via: [es] mailing liste

ICQ: 174153511


+26 Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?02.09.2007. u 10:43 - pre 202 meseci
TDatabase se koristio dok je bio aktuelan Paradox, znaci pre 5-6 godina
to je konekcija za kombinaciju jedan računar i baza za jednog korisnika
na jednom računaru, svaki rad preko mreže postaje muka

a drugo, ako ti na aplikacija bude radila preko mreže i ako na njoj
bude radilo n ljudi i kad kod svih tih n ljudi upit bude
radio svake 0.2 sekunde onda će se osetiti
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?02.09.2007. u 11:47 - pre 202 meseci
1. Što se tiče onih silnih grešaka, i ponovne uspostave veze.

Svaki deo koda koji je podložan greškama prikazanog tipa, ugnezdi u:
try / catch / finally
... blokove. To je osnovno. Greške hvataš, program ne puca i uvek shodno situaciji odreaguješ: npr, ponovo uspostavljaš vezu sa bazom i sl.

2. TDatabase

Kao što su ti već rekli, bolje koristi TADOConnection (barem su moja iskustva takva).

Konačno, ako je cela stvar samo u jednom upitu, uopšte ti i ne treba TDatabase niti TADOConnection, dovoljan je samo TQuery ili TADOQuery.

3. 0.2 s

Preterano loša ideja.
 
Odgovor na temu

DjGoran

Član broj: 123946
Poruke: 30



Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?03.09.2007. u 13:22 - pre 202 meseci
TQuery iz nekog razloga neće uvek da uspostavi vezu preko ODBC-a. TDatabase je uvek uspostavlja. Sem toga, u TQuery ne znam na koji način da korisničko ime i lozinku ugradim u sam program da me ne bi pitao na početku.

Citat:
X Files: Greške hvataš, program ne puca i uvek shodno situaciji odreaguješ: npr, ponovo uspostavljaš vezu sa bazom i sl.


Dobro, ali kako ponovo iz programa uspostaviti vezu sa bazom preko TDatabase?

Citat:
X Files:0.2 s
Preterano loša ideja.


Ok. Oko toga se svi slažete, ali niko mi nije još dao ispravan odgovor zašto je loša ideja, niti ponudio bolje rešenje.

Kao to rekoh, tabela je mala, rezultat upita je mali, a evo dodajem informaciju da je u pitanju p2p rad, odnosno postoji samo jedan program koji će da radi sa bazom na taj način, i neće biti više korisnika. Opterećenje servera je 0.2% pri takvim upitima, a opterećenje klijentskog kompjutera je nemerljivo 0.0%, opterećenje mreže je isto nemerljivo (ispod jednog promila: RX=11Kb/s TX=50Kb/s u odnosu na brzinu mreže od 100Mb/s), pa shodno svim tim činjenicama, ja ne vidim nijedan razlog zašto je takvo rešenje "loše"?

Ako neko zaista zna zašto je loše, neka:
1) Obrazloži zašto (opterećenje nije razlog, kao što smo videli iz gornje statistike)
2) Ponudi bolje rešenje (jer ako ne postoji bolje, ovo ne može da bude loše makar zauzimalo i 90% svih resursa)
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.amis.net.

ICQ: 174153511


+26 Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?03.09.2007. u 13:25 - pre 202 meseci
Citat:
DjGoran

Ok. Oko toga se svi slažete, ali niko mi nije još dao ispravan odgovor zašto je loša ideja, niti ponudio bolje rešenje.


zato što niko ne radi sa TDatabase već godinama
zato ti ljudi preporučuju bolje

ako je već tako, pogledaj šta radiš sa upitima ili konekcijom,
kaže ti key violation, što znači da unosiš dupli ključ u bazu

pogledaj šta se posle toga dešava sa konekcijom na TDatabase
zašto se zatvara

da li ih zatvaraš pa kasnije zaboraviš da otvoriš

debugger je strašna stvar ,
samo ako znaš da ga koristiš !!!!



Citat:
DjGoran:
Ako neko zaista zna zašto je loše, neka:
1) Obrazloži zašto (opterećenje nije razlog, kao što smo videli iz gornje statistike)
2) Ponudi bolje rešenje (jer ako ne postoji bolje, ovo ne može da bude loše makar zauzimalo i 90% svih resursa)


da bi ti neko ponudio rešenje, prvo moraš da izlošiš problem i ideju zašto to radiš


[Ovu poruku je menjao priki dana 03.09.2007. u 15:08 GMT+1]
 
Odgovor na temu

DjGoran

Član broj: 123946
Poruke: 30



Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?03.09.2007. u 14:08 - pre 202 meseci
U bazu se upisuju i loguju neka dešavanja. Postoje dve tabele, u prvoj se vode aktuelna dešavanja (dok traju) a u drugoj je log ranijih dešavanja. Upis novog dešavanja u bazu se radi na samom serveru iz posebnog programa, koji radi "realtime". Taj program isto radi i prebacivanje iz aktivne tabele u log tabelu (kada se dešavanje završi)

Aktivnih dešavanja ne može biti više od par desetina, tako da i baza ne može imati više od par desetina zapisa. U zapisu svakog dešavanja postoji kontrolno polje koje je na početku dešavanja postavljeno na "0".

kada moj program prozive tabelu aktivnih dešavanja (svakih 0.2 sekunde), on pravi upit SELECT * FROM tabela WHERE kontrolnopolje=0, i ako takav zapis nadje, onda radi UPDATE tabela SET kontrolnopolje=1 WHERE id='OnajOdMalopre', i istovremeno prikaže to dešavanje na ekranu, pri čemu ponudi izbor nekih opcija koje operater može da obavi.

Kada se dešavanje završi, program na serveru kopira zapis iz aktivne tabele u log tabelu, a zapis u aktivnoj tabeli menja tako što postavi kontrolnopolje=2. Moj program svakih 0.2 sekunde sem onog upita koji sam malopre naveo, pravi i upit SELECT * FROM tabela WHERE kontrolnopolje=2, i ako takav zapis nadje, on briše prikaz dešavanja za ekrana, a briše i zapis iz baze (DELETE FROM tabela WHERE id='OnajOdMalopre').


Dakle, shodno svemu rečenom, ako neko smatra da je moje rešenje sa prozivkom baze svakih 0.2 sekunde loše, neka:
Citat:
DjGoran:
1) Obrazloži zašto (opterećenje nije razlog, kao što smo videli iz gornje statistike)
2) Ponudi bolje rešenje (jer ako ne postoji bolje, ovo ne može da bude loše makar zauzimalo i 90% svih resursa)



Inače:
Citat:
priki: zato što niko ne radi sa TDatabase već godinama
zato ti ljudi preporučuju bolje

ako je već tako, pogledaj šta radiš sa upitima ili konekcijom,
da li ih zatvaraš pa kasnije zaboraviš da otvoriš
meni ova greška liči na to


Pa ne radim ništa, niti zatvaram niti otvaram. Naveo sam moj kod za pristup bazi ranije (pogledaj nekoliko postova iznad) i to je to. TDatabase je povezan automatski jer je tako zapisano u property (Connected := True), a kada probam da ga promenim iz programa (Form1.Database1.Connected := True;) to mi ne pomaže da vratim vezu koja je pukla.

Citat:
X Files:
Svaki deo koda koji je podložan greškama prikazanog tipa, ugnezdi u:
try / catch / finally
... blokove. To je osnovno. Greške hvataš, program ne puca i uvek shodno situaciji odreaguješ: npr, ponovo uspostavljaš vezu sa bazom i sl.


Pošto sam dakle Delfi počeo da učim pre nekoliko dana (i to Delfi 6 enterprise, pošto taj CD imam), možda bi neko mogao ukratko i približno da me uputi u smisao try / catch / finally blokova, tj. kako se oni u stvari koriste. I naravno, ostaje ono pitanje, kako iz programa uspostaviti "ponovo" vezu preko TDatabase (ili preko TQuery direktno na ODBC)?
 
Odgovor na temu

DjGoran

Član broj: 123946
Poruke: 30



Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?03.09.2007. u 14:12 - pre 202 meseci
Citat:
priki: kaže ti key violation, što znači da unosiš dupli ključ u bazu
pogledaj šta se posle toga dešava sa konekcijom na TDatabase


To je prva poruka koja se javi kada izvučem mrežni kabl iz kompjutera, znači da program u tom trenutku nema dodira sa bazom (pa stoga i ne može da unese dupli ključ). Zašto to kaže, nemam pojma. Onda idu druga, treća, i četvrta poruka.

Posle (kada spojim kabl nazad) ponavljaju se druga i treća poruka.
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.amis.net.

ICQ: 174153511


+26 Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?03.09.2007. u 14:18 - pre 202 meseci
čuj njega
ako se već voliš da se igraš sa mrežnim kablovima

onda moraš uraditi ovako

pre pokretanja svakog querija moraš postaviti
proveru da li ti je konekcija živa
to ćeš uraditi preko try except varijante

ako ti nije živa,
imaš dve mogućnosti

prva je da obavestiš korisnika da ne može da se spoji na bazu i
kraj priče

druga je
da ostaviš program u petlji dok se ne spoji na bazu
što ti nikako ne preporučujem
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?03.09.2007. u 23:39 - pre 202 meseci
Moguće je da i nećeš uspeti da ponovo uspostaviš vezu kada jednom pukne, pretpostavljam da je tu glavni problem u komponentama. Možeš pokušati da, rekreiraš komponente (uništiš postojeće i napraviš nove iste takve), prebaciš rad u poseban thread pa kad pukne, umesto restavanja čitavog programa, restartuješ samo thread. Ili možeš pokušati sa drugim komponentama za direktan pristup bazi, možda zeos, bilo je ranije preporuka na tu temu pa pogledaj.
Rad sa greškama, try, except i finally blokovi su dosta bitne stvari, to najbolje da pogledaš u helpu ili u nekoj dobroj knjizi. Moja preporuka je edicija za 21 dan.

 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Kad TDatabase izgubi vezu sa bazom, kako je vratiti?

[ Pregleda: 2296 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

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