Newsgroup: it.comp.java
Titolo: Problemi tra sessioni

Ciao a tutti,
in un'applicazione J2EE che ho realizzato per una intranet ho questo
problema:
alle volte (in qualche caso isolato) ho notato che se ci sono più
persone collegate lato server si verificano degli errori, nel senso
che i dati delle varie sessioni si sovrappongono creando dei problemi
nella visulizzazione dei dati.
Qualcuno sa dirmi come posso fare per evitare questi spiacevoli
inconvenienti, magari separando le varie sessioni in maniera che non
si sovrappongano tra loro??
Grazie mille.
A.



No, mi manca la palla di cristallo. Quali dati si scambiano? Come stai 
usando la sessione?
Posta qualche modesta riga di codice altrimenti non riceverai risposte.

si sovrappongano tra loro??
Mah, che dire ? Potresti fare un esempio di sovrapposizione dei dati ?
Eiste qualche classe o strato software che � incaricata di gestire le 
sessioni ?
L'isolamento tra sessioni (a livello di sessioID) � garantito dal container,
io non cercherei l� la natura del guaio.
Scorpio

 Scorpio
L'applicativo funziona in questa maniera:
attraverso una form è possibile inserire dei parametri per eseguire
una ricerca,
i dati vengono visualizzati in maniera tabellare, e per ciascuna voce
presente
nell'elenco dei risultati, è possibile visualizzare una scheda di
dettaglio.
Il malfunzionamento si verifica(saltuariamente) nella visualizzazione
della scheda di dettaglio,
ovvero viene visualizzata una scheda non conforme a quella richiesta,
ma relativa ai parametri
di ricerca inseriti da una altro utente collegato al sistema nello
stesso momento.
Il passaggio dati nella sessione lo gestisco attraverso dei Javabean
con scope di request o session a seconda delle esigenze.
A.


Ho fatto dei test e secondo me si tratta di un problema di consistenza
dei dati quando vi sono più accessi all'applicativo.
Se 2 persone lavorano contemporaneamente e ricercano i dati vengono
mescolati tra loro, è come se i dati nella sessione fossero in qualche
modo "sporcati" dalle ricerche effettuate da un altro utente.
Puo essere un problema di concorrenza?magari sull'accesso al DB??


Il DB non centra.
Stai usando le JSP? In che modo accedi ai dati in sessione?


Si sto usando le JSP, l'accesso ai dati in sessione lo faccio tramite
session.setAttribute e session.getAttribute.


Inoltre ho creato dei bean per passare i dati nella sessione e a
seconda dell'esigenza o dato lo scope session o request.


Puoi mostrare un frammento di JSP soprattutto dove dichiari le
variabili? Stai uando  la forma?
<%! .... %>


Il problema potrebbe essere quello di avere una variabile di sessione
dichiarata a livello globale nella servlet??
In questo modo:
public class Frontcontroller extends HttpServlet {
    protected static final Logger logger = Logger.getLogger
(Frontcontroller.class);
    HttpSession session;
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
        throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        session = request.getSession();
.....
.....
}
}


eccoti un esempio di dichiarazione variabili nella jsp:
<jsp:useBean id="fbl" scope="session"
class="it.CPV.JB.FattureBeanLista" />
<%
            String username = (String)session.getAttribute("username")
            String str_id = (String) session.getAttribute("idbean");
...
...
%>

 }
Questo potrebbe essere il problema. Infatti l'istanza della servlet
viene condivisa da tutti i thread quindi il codice che stai usando è
scorretto.
Questo problema, pero', dovrebbe evidenziarsi una tantum solo sotto
carico. E' il tuo caso?


Si si è esattamente il mio caso, ora ho provveduto a rendere locale la
variabile di sessione, dichiarandola localmente all'interno del metodo
in questo modo:
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)    throws ServletException, IOException
{
         response.setContentType("text/html;charset=UTF-8");
         PrintWriter out = response.getWriter();
         HttpSession session = request.getSession();
 .....
 .....
 }
Nelle pagine JSP ho invece aggiunto la seguente direttiva:
<%@ page isThreadSafe="true" %>
Ora il problema sembra essere risolto, ho infatti testato il sistema
sotto carico ed è andato tutto bene.


Tutto ok ma *togli queste direttive* dalle tue JSP. Così facendo stai
dicendo al container di eseguire serialmente tutti gli accessi a
quella pagina JSP, garantendo sì la thread-safety ma peggiorando di
molto e inutilmente le prestazioni.
Se prendi i dovuti accorgimenti non hai alcuna necessità di
un'esecuzione seriale.


Grazie mille!!!
Mi sei stato davvero di grande aiuto!!!
Alessandro