|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
[java-servlet] ambito delle variabilii
public class MioFilter implements Filter {
private FilterConfig filterConfig = null; private String h; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request=null; HttpServletResponse response=null; request = (HttpServletRequest)req; response = (HttpServletResponse)res; h=(String)request.getParameter("a"); for(int y=0;y<100000;y++){ System.out.println(y+" "+h); } chain.doFilter(request,response); } public void destroy() { filterConfig = null; } } se uno si crea un filtro(o anche una servlet) e utilizza una variabile di classe(come nel mio caso la stringa h)ho notato che accade che tale variabile (sotto tomcat) viene condivisa da tutti i thread che richiamano tale filtro(o nel caso di una servlet la servlet). cio' (penso) perchè la servlet (o il filtro) istanziata da tomcat è una sola e funziona in multithreading. per ovviare a questa cosa(che potrebbe causare evidenti danni) conviene dichiarare direttamente le variabili dentro i metodi, giusto???(oppure sincronizzare il codice ma mi sembra eccessivo) grazie Ultima modifica di prazision : 01-05-2005 alle 15:23. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5705
|
l'istanza puo' essere una sola oppure un numero ristretto, a seconda dell'application server che usi ma come hai evidenziato si pone un problema nel caso verosimile che piu' thread accedano all'oggetto.
L'uso di variabili locali (passate come parametri nei metodi) è una buon approccio per scrivere codice thread safe. non sincronizzare niente, in questo caso non è un buon approccio ![]() |
![]() |
![]() |
![]() |
#3 | ||
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
![]() Quote:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { ... String h=(String)request.getParameter("a"); ... } è sbagliato? grazie ( ![]() |
||
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2000
Messaggi: 235
|
Quote:
Pero' c'e' il rischio che diventi una scusa per non partizionare bene la logica ed i metodi del SW; mi e' capitato di dover manutenere codice di servlet che in questo modo avevano metodi di centinaia di righe di codice..... ![]() ![]() ![]() Puoi fare altre 3 cose:
Quando possibile cerco di usare prevalentemente la scelta 2, con la 1 e la 3 in misura minore. C'e' l'ulteriore beneficio di aver spostato la logica di esecuzione in una classe che non e' una servlet, quindi non dipende dal container, ed e' quindi piu' facilmente riutilizzabile e testabile.
__________________
...writing about climbing is boring. I would rather go climbing. (Chuck Pratt) Ultima modifica di theClimber : 01-05-2005 alle 16:58. |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5705
|
Quote:
intendevo esattamente questo, anche se è una soluzione spesso inelegante (ma il codice che si scrive dentro una servlet è poco "a oggetti", di solito). |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5705
|
Quote:
mi sono dimenticato ![]() lo ho da settimane sul piccì dell'ufficio ma non l'ho ancora guardato, scusa |
|
![]() |
![]() |
![]() |
#7 | ||
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
throws IOException, ServletException { ... altroMetodo((String)request.getParameter("a")); ... } Quote:
throws IOException, ServletException { ... NuovoOggetto ogg= new NuovoOggetto ((String)request.getParameter("a")) ogg.metodo(); ... } sono questi i 2 modi che intendi giusto?? già che ci sei mi dici una cosa che non ricordo mai. quando si dice ' campi di una classe' si intendono solo le variabili di quella classe o le variabili+ i metodi? grazie Ultima modifica di prazision : 01-05-2005 alle 17:08. |
||
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
Quote:
fa nulla, figurati non ti preoccupare, io ho 1000 cose da fare , se anche lo guardi fra 3 anni per me è uguale(per la verità fra 3 anni spero di essere ai caraibi al sole e non a lavorare ![]() |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Oct 2000
Messaggi: 235
|
Quote:
Questa non e' una buona cosa da farsi in una servlet, dat che richieste multiple possono essere parallelizzate in modo efficace in quanto hanno una parte dignificativa di IO di lettura e scrittura sugli stream. Le performance come tempi di risposta. capacita' di carico e scalabilita' del server ne risulterebbero compromesse.
__________________
...writing about climbing is boring. I would rather go climbing. (Chuck Pratt) |
|
![]() |
![]() |
![]() |
#10 | ||
Senior Member
Iscritto dal: Oct 2000
Messaggi: 235
|
Quote:
Con campi ('fields' in inglese) si intendono solo le variabili (ed in genere quelle non statiche se non specificato altrimenti) Quote:
__________________
...writing about climbing is boring. I would rather go climbing. (Chuck Pratt) |
||
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 458
|
grazie
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:15.