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

Pucanje konekcije pri pozivu stored funkcije

[es] :: PostgreSQL :: Pucanje konekcije pri pozivu stored funkcije

[ Pregleda: 1777 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.176.198.0



+14 Profil

icon Pucanje konekcije pri pozivu stored funkcije26.03.2009. u 17:46 - pre 140 meseci
Imam jedan problem na Postgres-u 8.3. Naime, imam jednu plpgsql stored funkciju koja obavlja odredjeni posao na bazi i pritom obavestava trenutno konektovane korisnike o promeni. Funkcija nije duga tako da cu je postovati celu:
Code:

CREATE OR REPLACE FUNCTION delete_patrol(patrol_id integer)
  RETURNS void AS
$BODY$  
BEGIN 
  UPDATE "Contacts" SET "ChangedTS" = now(), "ID_Patrol" = NULL WHERE "ID_Patrol" = patrol_id;
  IF FOUND THEN
    NOTIFY contacts_update; 
  END IF;
  UPDATE "Patrols" SET 
    "Active" = False,
    "ID_Status" = NULL,
    "StatusTS" = NULL,
    "ContactTS" = NULL,
    "GroupTSI" = NULL,
    "GroupName" = NULL,
    "ChangedTS" = NULL,
    "Comment" = NULL,
    "MemberCount" = 0,
    "ActualMemberCount" = 0
  WHERE 
    "ID_Patrol" = patrol_id AND 
    "Active" = True;
  IF FOUND THEN
    NOTIFY patrols_update;
  END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;


Funkcija se poziva iz Delphi GUI programa i radi normalno kada se pozove jednom ili par puta zaredom. Medjutim kada se funkcija pozove iz programskog loop-a u GUI-ju, npr. 40-50x zaredom, dodje do pucanja konekcije svim trenutno povezanim korisnicima (connection refused). Lako bih promenio funkciju da prima set ID-jeva za brisanje (deaktivaciju) i koristio UPDATE WHERE IN (), ali me zanima zasto se ovo desava jer koristim stored funkcije za sve moguce akcije na bazi i zato moraju biti stabilne. Da li ima neko neku ideju? Postoje li neki logovi (i gde) na postgresu koji bi mozda rekli zato se ovo desava?

Posto mi je ovo prvi projekat na postgresu zanima me jos jedna stvar: U dokumentaciji sam procitao da na postgresu sve stored funkcije rade pod implicitnom transakcijom. Da li to znaci da ako imam funkciju koja radi prvo DELETE pa UPDATE, ako DELETE prodje a dodje do runtime greske pri UPDATE-u, da ce se stanje automatski rollback-ovati, tj. da se prethodni DELETE nece izvrsiti?
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

MarkoBalkan

Član broj: 141124
Poruke: 1624
..147.213-dsl.net.metronet.hr.



+19 Profil

icon Re: Pucanje konekcije pri pozivu stored funkcije26.03.2009. u 21:40 - pre 140 meseci
problem ti je slijedeći

recimo iz .net kada se poziva baza, konekcija se ne mora otvoriti ručno ni zatvoriti, ali onda konekcija ostaje otvorena i zatvara se nitko nezna kad i stvara probleme.

ako imaš petlju u kodu recimo, mislim da moraš svaki put otvoriti konekciju i zatvoriti.

for i=0 to 100
konelcija.open
poziv procedure
konekcija.close
next

nisam siguran dali je do toga.

a zašto bi jednu te istu proceduru pozivao 40-50 puta?
 
Odgovor na temu

Boris B.
Ljubljana

Član broj: 213615
Poruke: 286
*.dial-up.dsl.siol.net.



+14 Profil

icon Re: Pucanje konekcije pri pozivu stored funkcije27.03.2009. u 20:02 - pre 140 meseci
>ako imaš petlju u kodu recimo, mislim da moraš svaki put otvoriti konekciju i zatvoriti.
>recimo iz .net kada se poziva baza, konekcija se ne mora otvoriti ručno ni zatvoriti, ali onda konekcija ostaje otvorena i zatvara se nitko nezna kad i stvara probleme

Cesto otvaranje/zatvaranje konekcije mi izgleda jako neefikasno (kada bi bilo efikasno ne bi postojale stvari kao sto je npr. connection pooling). Druga stvar, notifikacije ne bi radile (NOTIFY), jer ne bi imale koga da obaveste ako nema konekcije, jer Postgres se ne konektuje nazad na klijenta pri notifikaciji nego koristi postojecu konekciju. Treca stvar, pri svakoj konekciji klijent bi dobio drugi backend pid, sto je u mom slucaju nezeljeni efekat.

>a zašto bi jednu te istu proceduru pozivao 40-50 puta
Kao sto sam vec napisao, nije problem napisati funkciju koja prima opseg primarnih kljuceva i radi UPDATE WHERE IN, problem je u tome sto ovo ne bi smelo da se desava ni u kom slucaju, cak i kad se pozove 500x iz klijentske petlje, jer vec vidim na horizontu probleme kada jednom pocne 500 korisnika da aktivno koristi bazu
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.
 
Odgovor na temu

[es] :: PostgreSQL :: Pucanje konekcije pri pozivu stored funkcije

[ Pregleda: 1777 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

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