Variabili di sessione e sql server express 2005

mercoledì 18 gennaio 2012 - 20.39
Tag Elenco Tags  VB.NET  |  .NET 2.0  |  Windows Server 2003  |  Visual Studio 2008  |  SQL Server Express

cripoluz Profilo | Newbie

Buona sera.

Ho una webapp sviluppata in vb.net su un server virtuale di Aruba, i dati sono memorizzati su SQL Server Express 2005. Utilizzo cinque variabili di sessione per memorizzare alcuni dati degli utenti (id utente, livello profilo, gruppo appartenenza, ...). Il sistema è in piedi da cinque anni. La frequentazione era piuttosto bassa e nessun problema. In dicembre ho aggiunto una nuova parte che ha aumentato il numero degli accessi (al sito e di conseguenza alla base dati) e mi trovo ad avere in contemporanea anche 20/25 sessioni, tutte agiscono sulla base dati. Più che da quando ho inserito l'applicazione, direi da quando, in effetti, è aumentato il numero di utenti, si verifica il problema di scadenza, prima del normale timeout (20 minuti), delle variabili di sessione. In pratica, mentre l'utente sta lavorando, nel momento in cui chiede o salva dei dati, viene "buttato fuori" dal sito e reindirizzato alla pagina di login.

Mi chiedo (e vi chiedo) se eventuali limiti di Sql server possano in qualche modo far cadere la sessione (e le variabili) dell'utente... o se, sempliemente passando ad un server dedicato, più performante, la cosa potrebbe risolversi.

skraus Profilo | Junior Member

Quando scrivi "... i dati sono memorizzati su SQL Server Express 2005." ti riferisci ai dati di sessione o i dati su cui la web app lavora ?

Ciao
Sk

cripoluz Profilo | Newbie

I dati dell'utente vengono presi dal database e messi nelle variabili di sessione, per mantenere "viva" l'identità dell'utente durante la navigazione. Poi, ogni pagina dell'applicazione, interagisce con il database: scrive, interroga, manipola il database tramite sqldatasource o objectdatasource. Ogni tanto, l'utente viene "buttato fuori", a volte subito, a volte dopo qualche minuto... altre volte invece, fila tutto liscio. Mi chiedevo se "l'intasamento" di richieste alla base dati potesse in qualche modo disconnettere la sessione "internet" dell'utente, riconoscendolo poi come utente non loggato non trovando più le corrispondenti variabili di sessione popolate o se le sessioni possono andare in "crash" perchè la banda a disposizione con un server virtuale Aruba è limitata. L'intenzione sarebbe quella di passare ad un server dedicato, ma volevo avere qualche incertezza in meno...
Forse anziché spiegarmi ho complicato ulteriormente la comprensione...

skraus Profilo | Junior Member

Le variabili di sessione utilizzano come risorsa la memoria RAM del server web (salvo diversa configurazione del web.config) e vengono istanziate per ogni sessione per cui vanno utilizzate con accuratezza.

Hai pensato a sostituire le variabili di sessione con dei coockie ? Inoltre se ci fosse un time-out della sessione, il server web stesso te lo notificherebbe con un errore specifico. Allo stesso modo se il server DB interrogato non riuscisse a risponderti xkè oberato di richieste ti solleverebbe un'eccezione.

Secondo me il problema non sta nella carenza di risorse.

Per l'autenticazione usi un Provider o è custom ?
Sk

cripoluz Profilo | Newbie

Ti ringrazio per la sollecitudine nelle risposte.
L'autenticazione è custom.
Cookies: sì, sto valutando la cosa. Lavoro piuttosto "importante" da fare in questo momento.
Nel frattempo sto facendo delle prove e, sembra, che il "crash" (non so come altro chiamarlo) della sessione, avvenga proprio nel momento in cui faccio richieste un po' più pesanti al database, in particolare alle due tabelle "datiattuali" (50mila records e si arriverà a 250mila entro settembre) e "storico" (550mila records) per 350Mb di peso. Altre "aree" del sito che coinvolgono altri database o tabelle non hanno questo problema, le identità degli utenti non vengono perse e si continua a lavorare tranquillamente.
E' questo il motivo (richiesta "pesante" al database) per cui mi sto chiedendo se possa, l'interazione con SQL Server Express, per qualche ingorgo o crash o lentezza, sballarmi le variabili session.

skraus Profilo | Junior Member

Perdonami, ma quello che tu chiami crash della sessione è proprio un messaggio di errore Session Expired oppure fai riferimento sempre e solo al fatto che l'utente venga disconnesso ?

Nell'ipotesi A se è possibile avere uno screeshot dell'errore a video, nell'ipotesi b, ribadisco che per me l'errore è da cercare nel codice, ci devono essere delle istruzioni che determinano il redirect dell'utente verso la pagina di log-in.

Ossia anche se la RAM fosse sotto stress interverebbe il file di swap.

Ciao
Sk

alx_81 Profilo | Guru

>Hai pensato a sostituire le variabili di sessione con dei coockie ?
>Inoltre se ci fosse un time-out della sessione, il server web stesso
>te lo notificherebbe con un errore specifico. Allo stesso modo se
>il server DB interrogato non riuscisse a risponderti xkè oberato di
>richieste ti solleverebbe un'eccezione.
esatto, consideriamo che sql server express usa una sola CPU, con un solo giga di RAM disponibile e solo 4GB di dimensione massima per database.
Il 2008 amplia il limite di size del database, ma il resto è uguale. Quindi, se il db diventa interessante (considerato che il motore usa la ram per precaricare le cache, sia sui piani di esecuzione, sia per eventuali dati che servono subito disponibili) ovviamente 1GB di ram non consente di lavorare molto in memory e quindi qualche lettura da disco viene fatta, più il numero di connessioni attive aumenta, più le letture aumentano, più ram serve. Se ce n'è poca, il tutto si rallenta. Poi considera che un processore, anche se potente, potrebbe essere poco per alcune query (per alcune intendo fatte male, indici mal dimensionati, eccessive ricompilazioni, mancata hit della cache). Quindi diciamo che express è perfetto fino ad un certo momento. Nell'istante in cui trovi i primi seri rallentamenti, dovresti munirti di buona volontà e vedere cosa è possibile migliorare, dal punto di vista tipi di accesso/tipi di query/best practices seguite/modello efficace. Una volta che sei sicuro di essere vicino alla "perfezione" del tuo sistema, allora, sempre che non ci siano problemi hardware (e quindi, come dice skraus anche di risorse) è ora di cambiare l'edizione di sql server

>Mi chiedo (e vi chiedo) se eventuali limiti di Sql server possano in
>qualche modo far cadere la sessione (e le variabili) dell'utente... o se,
>sempliemente passando ad un server dedicato, più performante,
>la cosa potrebbe risolversi.
In base a quanto detto prima è semplice che qualche escalation ci sia. Però, se non prendi eccezioni sql, potrebbe essere che tu abbia problemi sul web server o sull'applicazione. A volte una mal gestione delle connessioni, una linea di codice che fa leak, ecc.. possono causare problemi di questo tipo.

Scusate l'intervento, spero possa essere utile.

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

cripoluz Profilo | Newbie

Grazie a tutti per le risposte.
skraus: niente errori, il server dimentica chi sono e ad una qualsiasi nuova richiesta mi invia al login. Anche perchè ogni pagina verifica la variabile session "userid", se la trova mi permette l'accesso, se non la trova mi rimanda al login.
Molto utili anche le considerazioni di alx_81.
Nel pomeriggio ho fatto numerose prove e ho settato parecchie cose sul server virtuale.
L'impressione che avevo era che, il timeout generato dalla connessione SQL server (vuoi per lentezza, vuoi per query malfatte o troppi utenti che interagivano con i dati, ...), generasse a sua volta un "timeout" anticipato delle variabili di sessione dell'utente. Pertanto alla successiva richiesta di dati al database, l'applicazione non trovava la variabile session dell'utente, chiedendo di conseguenza il login.
Pensato questo, ho settato il timeout della connessione sqlserver in "registrered servers/database engine" tramite "MS SQL server managment studio" a 60 secondi anziché i 15 di default... sembra che la situazione sia decisamente migliorata. Anche se forse è presto per dirlo.
Può essere?

alx_81 Profilo | Guru

>Pensato questo, ho settato il timeout della connessione sqlserver
>in "registrered servers/database engine" tramite "MS SQL server
>managment studio" a 60 secondi anziché i 15 di default... sembra
>che la situazione sia decisamente migliorata. Anche se forse
>è presto per dirlo.
>Può essere?
Se ti sputa e non ottieni errori è molto strano. Bisognerebbe indagare meglio tracciando le chiamate e cercando di simulare dei timeout per vedere di replicare il comportamento.
In generale il timeout dovrebbe darti un errore, e anche grosso, tipo "A network related...." e una pletora di messaggi legati.
A me sembra che ci sia anche qualcosa di applicativo sai? Se fa la redirect, la sessione è morta.. Fai qualcosa con la session? Sei sicuro che sia sempre utilizzata correttamente?
Cerca di ricreare il bug, cerca di debuggare costantemente le session e fatti dei log sul server per vedere se muore e se ci sono cause "invisibili".
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

cripoluz Profilo | Newbie

Buongiorno.

Ho rilevato questo errore, ma non è che sia molto ferrato in materia... mi sto documentando:
"Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.
ecc..."

Se avete qualche link... ben accetto!

Probabilmente, prima, rimandava al login, senza errore, a causa delle impostazioni dell'application pool di IIS 6


alx_81 Profilo | Guru

>Se avete qualche link... ben accetto!
vedi se questo ti aiuta
http://social.msdn.microsoft.com/Forums/hu-HU/vstswebtest/thread/cd9c5c03-4bf3-472b-814a-cd498b190c57
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

skraus Profilo | Junior Member

Qui parlano del tuo errore.

http://forum.aspitalia.com/forum/post/370519/Server-Error-InApplication.-Validation-OF-Viewstate-MAC-Failed.-.aspx

http://www.shnake.com/blog/?p=604

Ciao
Sk

cripoluz Profilo | Newbie

Buongiorno a tutti.

Sembra che le righe di codice che buttavano fuori tutti gli utenti collegati al sito fossero queste (le ho tolte e non succede più... per il momento).

If System.IO.Directory.Exists(Request.MapPath("cartella\") + sottocartella) = True Then System.IO.Directory.Delete(Request.MapPath("cartella\") + sottocartella, True) End If

Ogni volta che un utente si imbatteva in queste tre righe, tutti venivano "buttati fuori".

skraus Profilo | Junior Member

Ma avevi attivato qualche gestione custom degli errori ? Le istruzioni che hai indicato possono generare una eccezione se l'utente anonimo della tua web app non ha i permessi di scrittura/modifica e conseguentemenre di rimozione della cartella.
Sk

cripoluz Profilo | Newbie

No, l'applicazione mi restituisce gli errori standard. La pagina, comunque, faceva quello che doveva fare: verificava l'esistenza della cartella, se c'era, la cancellava con tutto il suo contenuto, la ricreava, metteva i nuovi file, creava una mail, allegava i file e inoltrava la mail (la media è di una ogni due/tre minuti). Solo che alla fine dell'operazione tutti risultavano "scollegati".
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5