[ vanhulio @ 24.08.2006. 22:45 ] @
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?
[ anon315 @ 25.08.2006. 00:44 ] @
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.
[ degojs @ 25.08.2006. 05:23 ] @
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 :)
[ degojs @ 25.08.2006. 05:33 ] @
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).
[ hyle @ 25.08.2006. 09:35 ] @
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.
[ vanhulio @ 25.08.2006. 12:29 ] @
Ok, hvala svima.
Hyle, to sam hteo da cujem. ;)

@degojs
ne bih koristio, nego jednostavno nisam mogao sebi da razjasnim (ocigledno nedovoljno poznavanje materije).
[ anon315 @ 26.08.2006. 20:12 ] @
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