350 messaggi dal 08 febbraio 2009
Sto usando WCF con Data Access Application Blocks.

Volendo usare lo stesso DB per tutta l'applicazione, ho creato una classe privata ma che viene istanziata una sola volta (la classe Database dell'application block).

Poi, nei vari metodi (esposti con WCF), uso quel database per eseguire le query.

Quando ho più query all'interno dello stesso metodo, allora apro la connessione (db.CreateConnection) e la uso per tutti i vari DbCommand.
Al termine del metodo, prima di uscire, la chiudo.


Al di là di usare la "using" (visto che DbConnection la supporta), che succede se due utenti entrano nei metodi "in contemporanea"?

Il db, essendo su WCF, si arrangia e mi da due connessioni diverse, oppure mi da una connessione unica per le due sessioni?
Nel primo caso dovrebbe andare tutto bene, nel secondo, invece, essendo la connessione la stessa, quando il primo metodo la chiude, questa viene chiusa anche per l'altro utente...

Lo chiedo perchè ho un problema strano: a volte si inchioda tutta l'applicazione WCF e necessito il riavvio per sbloccare il tutto. Rifacendo le medesime operazioni, però, lavora bene. Per questo pensavo ad un problema di "concomitanza" fra due processi.

Non so, a questo punto forse è meglio se uso un Database per ogni metodo esposto, però così rischio che lo stesso servizio utilizzi più connessioni...


Come si gestisce "di solito" la cosa?

Grazie mille
Non conosco nello specifico il block, ma credo che sotto usi comunque ADO.NET e le sue interfacce. Quindi se usi SQL puoi aprire tranquillamente più connessioni contemporaneamente, fino ad un massimo di 100, dopo di che chi apre una connessione resta in attessa fino a quando una si libera. Si libera quando viene fatta la close, quindi quello che devi fare è assicurarti che ogni oggetto che utilizzi, se implementa IDisposable dichiaralo con una bella using così sei sicuro di chiudere tutte le risorse, anche se qualcosa va storto.

Direi che quindi WCF non c'entra niente, anche se WCF dispone anch'esso di pool e limitazioni non mi sembra che tu faccia qualcosa di particolare. Per essere sicuro di basta guardare con sql management o con il profiler le connessioni attive e/o le query o eventuali dead lock, sempre se usi SQL. Dovresti infatti analizzare se va in timeout qualcosa e dove e si può dedurre meglio.

Ciao

Il mio blog
Homepage
350 messaggi dal 08 febbraio 2009
Grazie mille.

Facendo un po' di test, ho notato una cosa molto strana e inaspettata.
In pratica sto gestendo un muletto, quindi il mio client si collega al server via wireless (lo specifico qualora ci possano essere 'cose particolari').
Quando leggo un bancale e gli dico "è sul camion", l'applicazione fa una serie di letture per vedere se c'è altro sul camion (tutte le letture avvengono lato server).

Quindi, più bancali metto sul camion, più letture sul DB vengono fatte (più o meno 4 query per ogni lettura).

L'applicazione ho verificato che ha "problemi" anche se c'è un solo muletto operativo, quindi anche senza concomitanze (per cui ho escluso problemi di cursori e concomitanze come credevo in precedenza).

Capita a volte che se metto sul camion 10 bancali, l'applicazione per aggiornarsi ci mette 2 secondi (e ci può stare contando che ho 10 bancali, una rete wireless, ...).
Se nel giro di poco tempo ci aggiungo un bancale, per aggiornarsi ci mette 2 minuti!
Poi, ne aggiungo un altro e ci mette di nuovo qualche secondo...

Insomma, sembra quasi che "in qualche situazione" l'applicazione ci metta una marea ad aggiornarsi.

Non è una cosa che si verifica "facendo determinate operazioni", ma a intervalli irregolari di tempo capita che tutto si "blocchi" per poi ripartire.

Ora la mia principale "sospettata" è la rete wireless (magari mi si inchioda passando da un ponte radio all'altro, ma chissà!)...

Qualcuno ha qualche idea in più in proposito? Magari anche solo darmi un'idea di quali test io possa fare per verificare qualcosa (per esempio la rete)...

Grazie mille!
Quello che ti consiglio è di attivare il tracing su WCF così almeno vedi se arrivano le chiamate e le eventuali exception che si possono verificare. Se non hai toccato niente delle impostazioni, escluso il problema di rete, dovresti vedere le timeout exception o a livello di wcf oppure di sql ecc.

Ciao

Il mio blog
Homepage

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.