[Java/JSP] JavaBeans en application/session

Pagina: 1
Acties:

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Ik ben bezig een applicatie te bouwen in JSP. De hele bende draait op win2K server en maakt gebruik van een dedicated SQL Server 2000 via een dedicated 100Mbit Ethernet verbinding.

De verbindingen naar die database lopen via een connection pool (protomatter). De werking van de pool is simpel. De eerste keer dat je de pool gebruikt dient er een init uitgevoerd te worden. Dan worden zaken als poolsize, db url enz. gezet. Elke volgende verbinding kun je gewoon aanmaken met als driver de pool driver + de pool naam. De pool naam wordt geassocieert met de reeds uitgevoerd init en de aangevraagde verbinding wordt uit de betreffende pool gehaald. Er hoeft geen info over de verbinding mee meegegeven te worden, zoals username password e.d. Dat wordt allemaal binnen de pool geregeld.

Nu heb ik dus een aantal JSP pagina's die zelf niet direct in de database komen. Al deze bewerkingen lopen via een set JavaBeans. Ik heb nu een DbCon object (ook een bean) wat ik een "application" scope geef binnen JSP. Bij een aanroep naar een data bean geef ik de DbCon als var mee. Op die manier heeft de betreffende databean een referentie naar het DbCon object en kan dus een Connection uit de pool vissen. (via een methode DbCon.getConnection, zodat er in geen enkel bean connection info staat, behalve de DbCon bean).

Nu heb ik de volgende vragen: Hoe kan ik in een JSP omgeving (ik gebruik Macromedia JRun, maar Tomcat of JBoss zou ook kunnen) vanuit beans bij objecten in de application scope(en dus niet via het doorgeven van referenties)?

En, is er een nette manier om bij het starten van de applicatie de init voor de pool uit te voeren (DbCon object te creeeren) en een referentie naar het object te bewaren in de application scope oid?

Laatste vraag: wanneer ik de tags:
code:
1
2
3
<jsp:useBean id="dbObj" class="DbObj" scope="application">
  <jsp:setParameter name="dbObj" parameter="dbnaam" value="mijndatabs" />
</jsp:useBean>

gebruik, wordt de setParameter dan elke keer uitgevoerd? Of alleen als de bean met id "dbObj" nog niet in de application scope bestaat? Ik neem aan dat als ik de setParameter buiten de useBean tags zet dat ie sowieso wordt uitgevoerd, en dat als ie er binnen staat dat ie dan alleen wordt uitgevoerd als het object gecreeerd wordt, en dat zou maar 1 keer moeten gebeuren aangezien het een application scope heeft.

Tot zover mijn geraaskal voor vanavond :)

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
in principe als het een nette pool is werkt het zo:

een user vraagt een page
-> in jouw bean: new pool.getConnection(ofzo) pool bestaat niet dus init

volgende user vraagt een page
-> in jouw bean: new pool.getConnection(ofzo) pool bestaat al, returned bestaande connectie, pool wordt niet nog een keer geinit

in jouw situatie, je geeft GEEN object mee aan die bean maar in de bean instantieer je die pool. in principe regelt die pool dan dat er niet onnodig (teveel) nieuwe connecties worden geopend.

klinkt allemaal vaag maar is eigenlijk simpel. Jouw server maakt in principe een instantie van een JVM, binnen deze space draait jouw server, java heeft de optie om binnen een JVM instantie een class maar 1 enkele keer te kunnen instantieren. dit doet jouw connectie pool als het goed is. er zullen dus NOOIT 2 connection pools gemaakt kunnen worden, daarom hoef je dus niet in je applicatie scope je database connectie op te slaan. dit regelt de pool als het goed is al voor je.

als ik je probleem verkeerd heb begrepen of je snapt geen f*ck van wat ik hier bral, of het klopt niet, dan hoor ik het wel :)

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Ut klopt wat je zegt, maar .... :)

De pool wordt geinitialiseerd aan de hand van een methode. Deze zet een HashTable met parameters en creeert daarmee het pool object. In principe is daarna geen referentie meer nodig dat het object wat de pool gecreeerd heeft. Ik kan vanaf dat moment in elke klasse (JSP, Servlet, Bean) gewoon een Connection opengooien. Die gaat dan automatisch via de pool, aangezien dat op driver niveau geregeld is. Er wordt wel aangeraden een referentie naar het object te bewaren, omdat sommige JVMs de pool wel eens willen garbage collecten.

Nu wil ik in geen enkele klasse de driver + poolname gebruiken, simpelweg om later daarin te kunnen wijzigen, zonder alle klasses af te struinen. Hoe signaleer ik nu dat de init methode al eens is aangeroepen? Dat is de reden dat ik een referentie naar dat DbCon object in mijn application scope gooi. Als die referentie er is, en die is er altijd omdat DbCon als application bean is gedefinieerd, dan weet ik dat de init is uitgevoerd. Als ik die referentie niet mee zou geven aan de beans moet ik in de bean de DbCon class weer initen om er zeker van te zijn dat de pool gecreeerd is.

Dus de vraag blijft: is er een manier om vanuit beans application objecten te benaderen? Te controleren of ze bestaan, en zo nodig alsnog te creeeren?

Of zie ik nu meer structurele zaken over het hoofd?

  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
zou ik de referentie naar de pool ook in een statische var kunnen gooien? En als die null is alsnog de init uitvoeren?

Of praat ik nu n00bie taal?

Verwijderd

edit:

Niet goed gelezen, antwoord was er all