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

DataLayer kao Singleton

[es] :: Java :: DataLayer kao Singleton

[ Pregleda: 3286 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vanhulio
student
Beograd

Član broj: 72088
Poruke: 40
*.dynamic.sbb.co.yu.



Profil

icon DataLayer kao Singleton24.08.2006. u 22:45 - pre 214 meseci
Kako ce se ponasati (web) aplikacija u slucaju da DataLayer klasu izvedem kao Singleton obrazac?
Znaci ako bi na nivou aplikacije postojao samo 1 objekat za pristup bazi, u slucaju obicne (desktop) aplikacije koja ne koristi niti, verovatno ne bi bilo razlike, dok kod web aplikacije gde svaki klijent sa svojim zahtevom pravi posebnu nit, bi dovelo do degradacije performansi.

Da li ispravno razmisljam?
Two items walk into a ToolBar.
The bartender says, “Can I get you a menu?”
“No thanks, we're looking for a little action.”
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl.sezampro.yu.



+13 Profil

icon Re: DataLayer kao Singleton25.08.2006. u 00:44 - pre 214 meseci
Ja mogu da ti kazem iz mog skromnog iskustva sta sam naucio, pa ti mozda pomogne.

Radim na projektu koji koristi Oracle Toplink tehnologiju. U data sloju postoji Session EJB Bean u kome se nalaze "named query-ji" koji ustvari apstrahuju sirov SQL, procedure i f-je. Svaki taj upit, procedura ili f-ja prvo mora da dohvati sesiju, odradi posao, a zatim otpusti sesiju i ostavi je drugom na raspolaganje.

Kada nam se pojavila potreba da pozivamo stored procedure i f-je, dok jos nismo znali kako se to radi, one su bile smestene u nekom session beanu koji je cuvao nekakvo stanje ili u backing bean-u strane. Tada se pojavi problem kako dohvatiti sesiju. Onda smo pokusali tako sto je svaka f-ja/procedura kreirala novu sesiju i radila neki posao. Ovo je napravilo havariju upravo iz razloga sto je bilo potrebno koristiti singleton design pattern. Kada smo tako resili, problemi su skoro nestali. A onda se javio drugi problem, jer smo zaboravili da otpustamo sesiju i jos neki problemi. Uglavnom, bila je poenta smestiti sve u data sloj gde mu je i mesto, a postojala je samo jedna privatna sesija koja se pomocu factory-ja kreirala u konstruktoru. Sve metode se dohvatale tu sesiju, radile posao u otpustale je.

Ne verujem da ti je mnogo pomoglo ovo sto sam ti pricao, ali uglavnom, imao sam situaciju sa singletonom kada se sesija uzimala, radio posao, a zatim nije otpustala, pa je ostala zarobljena. Mogu da ti kazem da pazis na to. A sto se tice ideje, pa kapiram da je to ista ta prica, ovde postoji jedan Session EJB bean koji prati facade design pattern, postoji samo 1 (mada moze da ih ima vise, ali to je sad druga prica) i preko njega se pristupa.
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: DataLayer kao Singleton25.08.2006. u 05:23 - pre 214 meseci
Vanja, ako koristiš neki EE server (Glassfish, SJSAS..), stvar se svodi na ubrizgavanje EntityManagerFactory i EntityManager-a (Googlaj za "JPA injection") koristeći "Annotations" - praktično 2-3 linije koda, gde treba. Nema potrebe za singetonom i ostalim, koliko je meni poznato.

Singleton pattern za EntityManagerFactory.. je potreban u slučaju da JPA (Java Persistence API, dakle npr. TopLink Essentials) koristiš iz Java SE okruženja (npr. TomCat). U tom slučaju, mislim da je najbolje implementirati ServletContextListener listener: jedan metod se izvršava samo jednom - kada se web aplikacija stavlja u pogon na serveru (npr. TomCat) i drugi, kada se aplikacija "gasi". U prvom slučaju se kreira referenca do EntityManagerFactory-ja, a u drugom se Factory zatvori.

Otprilike..(mada, može i značajno kraće! Ovako je da se ljudi upoznaju i sa metodama u listeneru):
Code:

public class ApplicationListener implements ServletContextListener
{
    private EntityManagerFactory emf = null;
    
    public void contextInitialized(ServletContextEvent sce)
    {
        System.out.println( "Application initialization..." );
        if ( emf == null )
        {
            emf = javax.persistence.Persistence.createEntityManagerFactory( "proba1PU" );
            // .... dalje radi šta ti je volja sa referencom na Ent. Man. Fac. / izloži je da bude dostupna ostalim komponentama..
        }
    }

    public void contextDestroyed(ServletContextEvent sce)
    {
        System.out.println( "Application shutdown..." );
        if ( emf.isOpen() )
            emf.close();
    }

Što naravno, povlači da samo još TomCatu trebaš reći, u web.xml, o ovom listeneru, kako bi pozvao ove dve metode pri startu/gašenju.

A to onda omogućuje da tu referencu (emf) proslediš gde i kada treba, tako da u nekom JSP-u ili servletu jednostavno imaš:
Code:

EntityManager em = xxxx.getEMF().createEntityManager();
...
...
finally {
 em.close();
}




Sve u svemu, uskoro, verovatno seledeće nedelje ću da objavim jedan (kasnije valjda još neki) tekst na NoveTehnologije.com baš na temu korišćenja baš JPA (sa osvrtom na ORM) Trebalo bi da bude interesantno :)
Commercial-Free !!!
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: DataLayer kao Singleton25.08.2006. u 05:33 - pre 214 meseci
Citat:
Kako ce se ponasati (web) aplikacija u slucaju da DataLayer klasu izvedem kao Singleton obrazac?
Znaci ako bi na nivou aplikacije postojao samo 1 objekat za pristup bazi, u slucaju obicne (desktop) aplikacije koja ne koristi niti, verovatno ne bi bilo razlike, dok kod web aplikacije gde svaki klijent sa svojim zahtevom pravi posebnu nit, bi dovelo do degradacije performansi.

Da li ispravno razmisljam?


Pazi samo da ne dođe do mnogo goreg problema - da više niti "uđe" u klasu i dođe do prepisivanja podataka.

Inače, zašto bi koristio singleton?

(Usput, gore pomenuti EntityManagerFactory je thread-safe).
Commercial-Free !!!
 
Odgovor na temu

hyle
Perica Milošević
Belgrade

Član broj: 30030
Poruke: 150
82.117.206.*

Sajt: www.linkedin.com/in/peric..


+4 Profil

icon Re: DataLayer kao Singleton25.08.2006. u 09:35 - pre 214 meseci
Metode tvog DataLayer-a mogu da se pozivaju iz više Thread-ova bez problema i to ne bi dovelo do degradacije performansi.

Problem bi nastao ukoliko DataLayer ima neke svoje property-je i tada bi morao da vodiš računa da paralelni pristup tim property-jima ne izazove probleme, kao što čovek reče, može doći do prepisivanja podataka. Ukoliko bi hteo da izbegneš prepisivanje podataka onda bi morao da koristiš zaključavanje resursa ili da koristiš kolekcije koje su Thread safe a to bi sigurno izazvalo degradaciju performansi.

Usko grlo bi ti bila konekcija za rad sa bazom podataka. Ukoliko imaš multithread aplikaciju ne možeš da koristiš jednu konekciju za rad sa bazom podataka, tj. možeš ali bi bio popriličan red čekanja za tu konekciju :)

Trebao bi ti neki ConnectionPool da vodi računa u uspostavljanju i gašenju konekcija, a ti bi samo uzimao i vraćao konekcije u pool. Mogao bi da iskopaš neki gotov connection pool na netu ali uglavnom se za takve aplikacije koriste aplikativni serveri koji, između ostalog, vode računa i o tome.
 
Odgovor na temu

vanhulio
student
Beograd

Član broj: 72088
Poruke: 40
*.dynamic.sbb.co.yu.



Profil

icon Re: DataLayer kao Singleton25.08.2006. u 12:29 - pre 214 meseci
Ok, hvala svima.
Hyle, to sam hteo da cujem. ;)

@degojs
ne bih koristio, nego jednostavno nisam mogao sebi da razjasnim (ocigledno nedovoljno poznavanje materije).
Two items walk into a ToolBar.
The bartender says, “Can I get you a menu?”
“No thanks, we're looking for a little action.”
 
Odgovor na temu

anon315

Član broj: 315
Poruke: 1657
*.adsl.sezampro.yu.



+13 Profil

icon Re: DataLayer kao Singleton26.08.2006. u 20:12 - pre 214 meseci
Degojs, OAS10 zapravo (OC4J).

http://www.oracle.com/technolo...utorials/jsf-jpa-tutorial.html

Najveci trik je sto trenutno koristim RAD alat (Oracle JDeveloper 10.1.3 i ADF), pa sam na relativno visokom nivou (nije bilo vremena za detaljna istrazivanja zbog rokova), a slabije znam sta se desava ispod haube.

Ali, deluje dosta interesantno (i isplativo), kada prodje ludilo moram da otvorim haubu :) Pogotovu Toplink...

V
 
Odgovor na temu

[es] :: Java :: DataLayer kao Singleton

[ Pregleda: 3286 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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