Avatar billede fadme Nybegynder
29. august 2001 - 15:58 Der er 11 kommentarer og
1 løsning

static metoder i hjælpeklasser til servlets

Hej

Jeg er efterhånden blevet lidt forvirret. Jeg er ved at lave en DBpool til kontrol af connections til min DB, som jeg regner med alle servlets skal gøre brug af.

Jeg har selvfølgelig lavet den som en hjælpeklasse, der indeholder en masse static metoder osv.


efter lidt læsning på nettet er jeg dog kommet frem til flg. problem.

når man placerer sine hjælpeklasser i sit webapps dir på serveren, laver classloaderen ny instans af hver class fil. det betyder at der af mine hjælpe klasser også vil blive lavet en ny instans, således at der findes to eller flere ínstanser af mine static metoder, hvilket jeg finder lidt syret, men også upraktisk eftersom clienterne gerne skulle benytte den samme ressource.

nogen der ved hvordan jeg kommer uden om det problem?

MVH Fadme
Avatar billede kresten Nybegynder
29. august 2001 - 16:01 #1

Du bruger et singleton pattern.

Læs mere på f.eks. http://members.tripod.com/rwald/java/articles/Singleton_in_Java.html
Avatar billede delbing Nybegynder
29. august 2001 - 16:01 #2
brug ServletContext
Avatar billede disky Nybegynder
29. august 2001 - 16:03 #3
Brug et singleton pattern, den skulle løse det problem.
Avatar billede fadme Nybegynder
29. august 2001 - 16:06 #4
jeg bruger allerede et singleton pattern, det er ikke det som er problemet. læs f.eks. følgende

Most Servlet Engines use a special class loader for Servlets to be able to automatically reload a Servlet when it is modified. This class loader handles all class files located in a special directory, typically named servlets. A common mistake among new Servlet developers is to also put helper classes, such as the connection pool classes described here, in the servlets directory. This doesn\'t work at all when static variables are involved since the special class loader creates a separate class instance for each Servlet. To avoid this problem you should place all helper classes in the regular CLASSPATH used by the Servlet Engine. How you set the CLASSPATH varies between Servlet Engines so read the documentation for the product you use.

se også:

http://www.webdevelopersjournal.com/columns/connection_pool.html

fadme
Avatar billede delbing Nybegynder
29. august 2001 - 16:09 #5
singleton patterns duer ikke pga problemerne med static
Du kan lave noget i stil med det herunder(DBPool har to statiske metoder, ATTR_NAME som er en String der giver compile-time checking attributnavnet, og getPool() der laver og returnerer en pool). Der er synkroniseringsfejl og sikkert andet galt her, men det illustrerer brugen


ServletContext context = getServletContext();
DBPool pool = (DBPool) context.getAttribute(DBPool.ATTR_NAME);
if (pool==null) {
pool = DBPool.getPool();
context.setAttribute(DBPool.ATTR_NAME, pool);
}
Avatar billede fadme Nybegynder
29. august 2001 - 16:10 #6
for lige at komme videre råder ovenstående tekst mig til at lægge klasserne et sted hvor \"the regular CLASSPATH\" finder dem, så der ikke laves en ny KLASSE-instans af hver fil. Men eftersom jeg ikke selv hoster, hvordan kan jeg så gøre dette.

fadme
Avatar billede delbing Nybegynder
29. august 2001 - 16:11 #7
Ovenstående kode foregår forresten i en HttpServlet. Det er nok pænere at lade det foregå et andet sted, så koden i din servlet kommer til at se fx sådan ud

DBPool pool = DBPool.getPool(this);

så kan den statiske getPool metode få fat i ServletContext og gøre det samme
Avatar billede fadme Nybegynder
29. august 2001 - 16:13 #8
sorry delbing jeg nåede ikke at læse dit andet svar inde jeg postede min sidste kommentar. Jeg kigger lige på det.

Avatar billede delbing Nybegynder
29. august 2001 - 16:13 #9
Jeg ved af erfaring det er en smertefuld oplevelse at bruge statiske variable til at dele resurser i et servletmiljø. Brug ServletContext.
Avatar billede kresten Nybegynder
29. august 2001 - 16:17 #10
Well, så lærte jeg også noget i dag :-)
Avatar billede lbhansen Nybegynder
29. august 2001 - 19:16 #11
hmm. DB pool, ja dem har man sgu da nok kodet et par stykker af:)

Men det er slut. der ligger en opensource pool på http://www.codestudio.com.

Udover at lave pooling, så lægger den sig over en eksisterende driver, og implementerer jdbc 2.0 optional package.

Dette resulterer i transparant pooling og scrolable resultsets.

Den giver kanon performance, har dog kun testet den mod MySql
Avatar billede fadme Nybegynder
31. august 2001 - 11:22 #12
tak for hjælpen, det kører nu :-)

Fadme
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester