Olen tässä tutustunut hieman J2EE arkkitehtuuriin, ja nyt ajattelin "nipottaa" eräästä ykityiskohdasta.
-Jsp -sivun pn oltava nk. thread safe, koska palvelin luo servlet oliosta vain muutaman (yleensä yhden) ilmentymän. Tätä ilmentymää kierrätetään sitten monessa sessiossa, joita jokaista ajetaan omassa threadissään.
-Tämä on loogista, sillä mikäli palvelimen annettaisiin vapaasti luoda aina uusi ilmentymä, niin koneen muisti/stack saattaisi loppua, ja tästä aiheutuisi turvariski.
-Useinhan palvelinarkkitehtuureissa esim. yhteydet (serversocket) poolataan taulukkoon, eikä jokaista yhteyttä varten perusteta näin aina omaa uutta säiettä. Näitä sitten kierrätetään, ja mikäli kaikki on käytössä, loput pyynnöt laitetaan joko jonoon odottamaan, tai sitten ne hylätään. Tämä juuri yllämainitusta syystä.
-Nyt esim. jsp:ssä, jos olio käyttää metodeissaan instanssimuuttujia, ne täytyy synkronoida. --> pullonkaula. Pullonkaulan välttämiseksi tarvittavista metodiparametreista voidaan luoda oma luokkansa, ja parametrit välitetään metodille luomalla luokasta aina uusi ilmentymä. Ratkaisu on "thread safe".
esim.
public void foo(Fooparameters foodata){
//do something with the foodata
}
%>
-Ok, siinä lyhyesti teoria. Toivottavasti siitä tajuaakin jotain. Sitten kritiikkiin...
-On ymmärrettävää että säieturvallisia ratkaisuja tarvitaan. Silti tuntuu siltä, että tässä kierretään alkuperäinen syy luoda olioista vain yksi instanssi, ja synnytetään taas uudelleen riski pinon täyttymiselle.
-Mikäli instanssi kerran laitenaan luomaan aina uuden olion (jokainen sessio luo oman dataolionsa), niin mitä järkeä oli alunperin rajoittaa jsp-instanssit yhteen/muutamaan?
-Ok, tuollaiset dataioliot ovat lyhytaikaisia, mikäli roskienkeruu toimii kunnolla ja kooltaan usein pienempiä kuin esim. koko servletin muodostama uusi instanssi , mutta silti niiden käyttäminen jättää meille turva-aukon, jota alunperin yrittiin välttää rajoittamalla servlet-instanssien määrää. Ohjelmoijan pitäisi siis tällöin itse raknetaa kontrolli /pooli/factory itseluomilleen instansseille. Tämä on toki mahdollista, mutta miksi näin on, kun kerran j2ee containereiden pitäisi nimenomaan huolehtia tällaisista asioista automaattisesti?
-Eli käsittääkseni servletolioiden määrän rajoittaminen ei poista ongelmaa, se vain siirtää mahdollisesti aihetuvaa ylivuototilannetta tuonnemmaksi --> virheen etsiminen hankaloituu.
-En mene vannomaan etteikö asiaa olisi jollain tavalla hoidettu. Olen myös saattanut ymmärtää koko asian väärin. Jos joku tietää enemmän tästä, niin kuulisin mielelläni siitä.
J2EE arkkitehtuuri ja jsp.
1
325
Vastaukset
- ~~~
> -Nyt esim. jsp:ssä, jos olio käyttää
> metodeissaan instanssimuuttujia, ne täytyy
> synkronoida. --> pullonkaula.
Instanssimuuttujien tekeminen servleteissä on yleensä aina huono idea(tm) ja logiikka tulisi aina sijoittaa erillisiin luokkiin, ei näkymän luovaan JSP-sivuun. Myös synkronointia tulisi välttää jos vain mahdollista.
Servlettejä voi kuitenkin ajaa myös instansseittain säikeistettynä:
http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/SingleThreadModel.html
Tai JSP-sivulla asetuksella:
Ennen kuin jatkan eteenpäin, kannattaa tutustua Sunin J2EE blueprinttiin JSP:n virheistä:
http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/web-tier/web-tier3.html#1097924
Eli JSP-sivulle pystyy kyllä kirjoittamaan Java-koodia, mutta sitä tulisi välttää kuin ruttoa. Hyviä syitä löytyy ylläolevasta dokumentista. JSP sivu on vain MVC:n näkymäosa, eikä sen pitäisi sisältää mitään logiikkaa.
Lyhennettynä seuraavanlaisia merkkijonoja tulisi välttää JSP-sivulla:
> -Mikäli instanssi kerran laitenaan luomaan aina
> uuden olion (jokainen sessio luo oman
> dataolionsa), niin mitä järkeä oli alunperin
> rajoittaa jsp-instanssit yhteen/muutamaan?
Servletit monesti toteuttavat niin simppeliä logiikkaa ja niitä pyydetään jatkuvalla syötöllä, että useimmiten tuosta poolaamisesta on hyötyä. Tietysti jos jokainen servletin http-kutsu johtaa johonkin jättipäivityksiin tietokantojen puolella, niin silloin siitä ei niin suurta hyötyä olekaan.
> -Ok, tuollaiset dataioliot ovat lyhytaikaisia,
> mikäli roskienkeruu toimii kunnolla ja kooltaan
> usein pienempiä kuin esim. koko servletin
> muodostama uusi instanssi , mutta silti niiden
> käyttäminen jättää meille turva-aukon, jota
> alunperin yrittiin välttää rajoittamalla
> servlet-instanssien määrää.
Tarkoitit varmaankin juuri toisinpäin? Eli että instanssien jako aiheuttaa instanssimuuttujien näkymistä muillekin servletin kutsujille?
Ratkaisu on simppeli: Älä käytä luokka- tai instanssimuuttujia servleteissä. Muistinkäytöllisesti metodin sisäiset oliot ovat lyhytaikaisia ja ne kerätään tehokkaasti gc:n toimesta, siitä ei kannata huolestua.
> -Eli käsittääkseni servletolioiden määrän
> rajoittaminen ei poista ongelmaa, se vain
> siirtää mahdollisesti aihetuvaa
> ylivuototilannetta tuonnemmaksi --> virheen
> etsiminen hankaloituu.
Ylivuoto-ongelma on Javassa varsin olematon, JVM pitää tästä huolen. Jos taas tarkoitat muistivuotoa, niin sekään ei ole ongelma niin kauan, kun kysymys on metodin sisäisistä lyhytaikaisista olioista, jotka siivotaan heti seuraavan keruun aikana.
Jos oikeasti olet kiinnostunut tutkimaan hyviä tapoja toteuttaa web kerros J2EE-maailmassa, niin suosittelen seuraaviin ratkaisuihin tutustumista:
Komponenttipohjainen ratkaisu (3 sukupolvi):
- Jakarta Tapestry
- Sun JavaServer Faces & JSTL
Tapahtuma-pohjainen ratkaisu (2 sukupolvi):
- Jakarta Struts
- OpenSymphony WebWork & SiteMesh
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Putin hoiti Suomen natoon ja myös Ruotsin
Iso kiitos Vladimir Putinille. Hänen ansiosta pääsemme nyt Natoon. Putin halusi Naton lähelle ja nyt sai. Voimme tästä kiittää vain Putinia.6568023Niinistö teki hetkessä Suomesta Venäjän ydinaseiden maalitaulun
Kaiken lisäksi mies vielä lällätteli Putinille eilisessä tiedotustilaisuudessa ja käski katsomaan itseään peiliin. Kyllä vähän asiallisempaa käytöstä4672306Voi Stefu ja sun kiivas luonteesi
Sielä lentelee ullakkohuoneiston ikkunasta daamin vaatteet ja matkalaukut pitkin pihaa. Toisaalta,en ihmettele yhtään että tämä suhde päättyi näin,kyl2332228- 1471803
Ohhoh! Martina Aitolehti ja seurapiirihurmuri-Jesper ekassa yhteiskuvassa - Sutinaa Mallorcalla!
Martina Aitolehti ja seurapiirijulkkis-Jesper nauttivat toisistaan varsin vauhdikkaissa merkeissä Mallorcalla. Aitolehti ei ole esitellyt rakastaan vi281302Veikkaus: Miten The Rasmus pärjää Euroviisuissa?
Euroviisuhuuma on ylimmillään, kun Suomi ja The Rasmus taistelee biisillään Jezebel. Bändi on tikissä, kunhan Lauri Ylösen ääni kantaa. Mitä veikka511244Stefanilta tuli taas karu totuus Sofiasta
Marokkolainen h*o*ra! Voi tsiisus kun mulla on hauskaa! Lumput lentää ikkunasta kun Stefu raivoaa h*uralleen🤣🤣🤣 Nyt ne popparit tulille, tästä tule1131186Ootko onnellinen kun ei tarvitse
nähdä tätä tyhmää naamaa enää koskaan? Multa se särkee sydämen, mutta minkäs teen. Vaikka olisi kuinka sinnikäs eikä hellittäisi, se ei aina auta.65855Steppuli veressä
Seiskan lööpissä Steppulilla naama ja nyrkit veressä. Ei tainnut ihan kamojen pihalle paiskominen riittää. Onkohan pistänyt kämpän tuusannuuskaks.59841Oletko nähnyt eroottiset kohuleffat? Fifty Shades Of Grey -trilogia tv:stä
Fifty Shades -trilogia starttaa, kun nuori opiskelijanainen Anastasia tapaa rikkaan liikemiehen. Seksisuhdehan siitä starttaa, höystettynä sadistisill7769