Forum » Programiranje » PHP - Podatkovna baza / vzorec singleton, ki počisti za sabo
PHP - Podatkovna baza / vzorec singleton, ki počisti za sabo
JanBrezov ::
Imam PHP/MySql spletno aplikacijo. Implementiran imam razred DataBase, ki ima statično metodo za izvajanja poizvedb na bazo. Ta metoda porihta vse: odpre povezavo, izvede nastavitve, izvede poizvedbo, zapre povezavo in vrne rezultat, če potrebno. Za vsako poizvedbo se izvede celoten postopek ponovno. Vem, da je to potrata, vendar do sedaj to ni bil problem, saj se na spletni strani zgodi malo poizvedb, hkrati pa uporaba podatkovne baze oz. razvoj zelo enostaven - en klic statične metode. Spletna aplikacija ima za sabo tudi določene CLI skripte, ki vsake toliko porihtajo določene zadeve, tudi tam se uporablja isti razred. Ena od teh CLI skript pa je bolj zahtevna in generira tisoče poizvedb, zato nameravam izvesti optimizacijo, ena od teh je, da uporabim eno povezavo do baze za vse poizvedbe znotraj ogleda strani oz. znotraj zagona CLI skripte (ki lahko teče par ur).
Kakšen je najboljši način, da to izvedem? Še vedno želim imeti statično metodo za izvajanje poizvedb. Aplikacijo bo razvijalo več ljudi in nočem, da se vsak ukvarja z bazo. Povezava more preživeti tudi dolgo trajajoče skripte, kjer se podatkovna baza vmes dejansko ne uporablja (čaka na web servis). Uporaba dodatnih ogrodij ni zaželjena, še posebej zato, ker večina ne podpira shranjenih procedur (modul mysqli).
Trenutno sem že šel skozi to:
Predlogi?
Kakšen je najboljši način, da to izvedem? Še vedno želim imeti statično metodo za izvajanje poizvedb. Aplikacijo bo razvijalo več ljudi in nočem, da se vsak ukvarja z bazo. Povezava more preživeti tudi dolgo trajajoče skripte, kjer se podatkovna baza vmes dejansko ne uporablja (čaka na web servis). Uporaba dodatnih ogrodij ni zaželjena, še posebej zato, ker večina ne podpira shranjenih procedur (modul mysqli).
Trenutno sem že šel skozi to:
- moja prva ideja je bila nadgraditi prej omenjen razred, da v statičnem konstruktorju izdela povezavo do baze, v statičnem destruktorju pa povezavo zaprem, vendar statični destruktor v PHP sploh ni možen.
- Kar želim je dejansko vzorec singleton. Na uradni PHP strani imajo primer, vendar noben ne rešuje samodejne destrukcije.
- Našel sem PHP funkcijo "register-shutdown-function", kjer bi lahko sam klical destruktor za omenjen razred, vendar eden od komentarjev odsvetuje uporabo za zapiranje baze.
Predlogi?
NeOman ::
Morda ideja - najprej predelas tvoj osnovni razred DataBase tako, da ga instanciras samo enkrat (singleton), na ta nacin bos izognil veckratnemu povezovanju na bazo.
Opomba: Pisem iz glave, tako da lahko, da je kje kaksna napaka.
Če pa bi želel ohraniti arhitekturo ter programerjem olajšati delo lahko narediš wrapper, preko katerega poganjaš CLI skripte ter ob končani skripti pokličeš metodo razreda, ki skrbi za zapiranje povezave.
class DB { private static $instance; private function __construct() { // ... } public static function getInstance() { if (!self::$instance) self::$instance = new DB(); return self::$instance; } }
Opomba: Pisem iz glave, tako da lahko, da je kje kaksna napaka.
Če pa bi želel ohraniti arhitekturo ter programerjem olajšati delo lahko narediš wrapper, preko katerega poganjaš CLI skripte ter ob končani skripti pokličeš metodo razreda, ki skrbi za zapiranje povezave.
http://xhtml.si - HTML, CSS in JavaScript po vaši meri.
JanBrezov ::
Da, zgoraj navedeno je singleton vzorec. Ampak jaz rabim takšnega, da se sistemsko sam uniči. Torej na koncu spletne strani ali CLI skripte si ne želim klicati dodatnih funkcij za zapiranje baze.
Problem je trenutno ta, da GUI del spletnih strani ni implementiran objektno. Če bi bil, je popravek enostaven; zapiranje baze bi implementiral v destruktorju bazičnega razredu, ki ga bi dedovale spletne strani.
Problem je trenutno ta, da GUI del spletnih strani ni implementiran objektno. Če bi bil, je popravek enostaven; zapiranje baze bi implementiral v destruktorju bazičnega razredu, ki ga bi dedovale spletne strani.
c3p0 ::
> Torej na koncu spletne strani ali CLI skripte si ne želim klicati dodatnih funkcij za zapiranje baze.
Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.
http://php.net/manual/en/function.mysql...
Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.
http://php.net/manual/en/function.mysql...
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [c++] globalne spremenljivke (extern)Oddelek: Programiranje | 1589 (1462) | Vesoljc |
» | [python] prednosti in slabostiOddelek: Programiranje | 2570 (2146) | Gundolf |
» | java in zapis v podatkovno bazoOddelek: Programiranje | 2034 (1902) | jogurtTM |
» | Izvorna koda mojega par dnevnega dela; ce jo malo pokomentirate :) (strani: 1 2 )Oddelek: Programiranje | 6463 (4808) | Microsoft |
» | [C++] for {}Oddelek: Programiranje | 1716 (1410) | Gundolf |