Avatar billede ppstyle Nybegynder
24. maj 2002 - 13:44 Der er 10 kommentarer og
2 løsninger

Forhindre servlet timeouts

Hej alle, hvorledes har I grebet følgende problemstilling an :

I har nogle hashtables ( som cache ), og andre statiske variabler, der instantieres første gang jeres servlet kører. Dette gælder også connectionpools osv.
Hvorledes holder i servletten i "live" hvis, den er inaktiv i en længere periode ?

Kan man overhovedet sætte parametre for hvornår en servlet skal time ud ??

Alle forslag/erfaringer er velkomne hold jer ikke tilbage.

mvh. Daniel
Avatar billede erikjacobsen Ekspert
24. maj 2002 - 14:12 #1
Er et ikke bare at sætte dem som application scope ?
Avatar billede disky Nybegynder
24. maj 2002 - 15:09 #2
Allerførst brug ikke servlets til sådanne noget, men brug almindelige java klasser.

De bliver ikke garbage collectet så længe nogen har en reference til dem.
Avatar billede ppstyle Nybegynder
24. maj 2002 - 15:24 #3
Vi snakker ikke om beans eller tag libraries.

Application scope sikrer blot, at class instansen ikke timer ud når en bruger session timer ud, men scope = application sikrer ikke mod en servlet timeout, der viirker således, at alt kodei fx. init(), skal geninitialiseres.

mvh. Daniel
Avatar billede ppstyle Nybegynder
24. maj 2002 - 15:26 #4
Jamen Disky -> hvordan kan man oprette instanser af normale klasser, der ikke er betinget af en servlet time out ???

Det er jo netop i init(), funktionen indledende klasse instanser skal oprettes ik ?
Avatar billede soelvpil Nybegynder
24. maj 2002 - 19:05 #5
Hvis dine variabler ligger som static i en eller anden klasse, holdes de i live, så længe serveren er i live.
Avatar billede ppstyle Nybegynder
24. maj 2002 - 20:05 #6
soelvpil -> er du sikker på det ?

Som jeg havde forstået det, var der både en session timeout, og en sevlet timeout. Men nu lyder det som om du siger, at servletten eksisterer sålænge serveren er oppe at køre ( fx. Tomcat eller Resin ).

Er det rigtigt forstået ?

mvh. Daniel
Avatar billede disky Nybegynder
24. maj 2002 - 20:07 #7
ppstyle.

det har INTET med session timeout at gøre.

Det session timeout sørger for er at din session stack forsvinder intet andet.
Avatar billede soelvpil Nybegynder
24. maj 2002 - 23:06 #8
Servlets findes så længe serveren er oppe at køre.

Der er dog ingen garantier for, om det er samme objekter af din sevletklasse du får fat i hver gang, det står serveren frit for, at oprette nye instanser (f.eks. hvis der er mange brugere), eller lukke dem igen. Men hvis du gemmer ting som static variabler, er du sikker på at kunne tilgå dem.

Men jeg ville nu nok foreslå blot at gemme dine ting i servletcontexten.
Avatar billede ppstyle Nybegynder
27. maj 2002 - 10:00 #9
Ok, en lille opsummering :

- Servletter lever sålænge webserveren kører ( har en instans kørende ).
- Sessioner timer ud efter et givent tidsrum, som kan bestemmes i  opsætningen.
- For at bibeholde statiske variabler kan de enten instantieres i init funktionen eller gemmes i servletcontexten.

Er ovenstående tre påstande rigtige ???

Håber ellers pointfordelingen er rimelig :)

Takker for hjælpen, hilsen Daniel
Avatar billede disky Nybegynder
27. maj 2002 - 10:21 #10
nåsten rigtigt

En servlet lever kun den tid de tager at udføre den.

Medmindre nogen har en reference til den.

p.s. Servlets er der oftest kun ulemper ved at bruge i forhold til JSP+Beans
Avatar billede ppstyle Nybegynder
27. maj 2002 - 11:26 #11
Hvad mener du hvis nogen har referencer til den ???
Betyder det der skal være mindst en session i live for at servletten lever ???
Hvad så med statiske variabler så som indholdet at en property fil, der kun skal indlæses engang ?
Avatar billede soelvpil Nybegynder
27. maj 2002 - 20:24 #12
Eks.

Du har en servlet

public class MinServlet extends HttpServlet {
  private int minInstansVariabel;
  private static int endnuEnVariabel;

  o.s.v
}

Du eksekverer request ved hjælp af objekter af klassen MinServlet. Du er dog ikke herre over, om det er det samme objekt af klassen der benyttes til to forskellige requests, eller der benyttes to forskellige objekter. Der er noget serveren bestemmer, og afhænger f.eks. af, hvor stor belastning der er på serveren.

D.v.s. at hvis du har en variabel i dit objekt (minInstansVariabel), og sætter værdien i den, i f.eks. en doGet-metode, får du sat værdien på dette objekt, men det er ikke sikkert, at du får samme objekt til næste request, så værdien kan være en anden.

Hvis du i stedet sætter værdien på den statiske variabel endnuEnVariabel, kan den tilgås fra ALLE objekter af klassen MinServlet, så det er måden at gøre det på.

Hvis dine variabler ikke ændrer værdi undervejs, kan du vælge at indlæse dem i init-metoden på din servlet. Denne metode vil blive kaldt for hvert OBJEKT af servlet-klassen. Men det letteste er nu at gemme dem i servlet-contexten.
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