80 messaggi dal 27 giugno 2001
www.portel.it
Premessa:
Ho sviluppato un motore di ricerca in C# che effettua ricerche in piu' db e in piu' tabelle contemporaneamente, partendo da una stringa di ricerca immessa dall'utente.
Per effettuare 50 ricerche in 50 tabelle e/o viste molto corpose il tempo di esecuzione e' di circa 4 secondi, che non e' male...solo che devo cercare velocizzarlo ancora di piu', e soprattutto di renderlo piu' snello in termini di memoria e CPU utilizzate.

Come funziona:
Le istruzioni SQL vengono generate run-time, raccogliendo da un db centrale i dati necessari per effettuare le ricerce (tipologia delle sorgenti, stringhe di connessione, nomi delle tabelle e dei campi etc...). Una volta raccolte tutte le informazioni vengono avviate contemporaneamente tutte le ricerche, tramite async delegates.

Dove sto cercando di velocizzare il tutto:
Dal momento che ogni connessione può essere (e spesso lo è) diversa dalle altre, per ognuna delle 50 (o più) ricerche viene istanziata e aperta una nuova connessione. La connessione viene poi chiusa e distrutta nel momento in cui i risultati ottenuti vengono recuperati tramite il callback del delegate.
Credo che questo creare e distruggere connessioni sia l'ostacolo maggiore per snellire il motore di ricerca.
Quello che ho pensato di fare è "raggruppare" le 50 sorgenti in base alla connessione utilizzata: se due o più sorgenti condividono la stessa sorgente (e differiscono solo per tabelle e campi di ricerca) si potrebbe, in teoria, riutilizzare la stessa connessione (e chiuderla solo alla fine).

Il problema:
Dal momento che il codice viene eseguito contemporaneamente su differenti threads, l'applicazione genera un errore perche' mi dice che la connessione ha gia' un DataReader associato che non e' stato chiuso.

Scusate se mi sono dilungato. Ho cercato di riassumere come meglio ho potuto, cercando di essere il piu' chiaro possibile.

Qualcuno avrebbe idea di come risolvere questo problema?

La contemporaneita' nell'esecuzione delle differenti ricerche e' d'obbligo, pero' questo sembra scontrarsi con la possibilita' di riutilizzare la stessa connessione...

Grazie mille
Filippo

--
http://my.opera.com/filippo/
coffee wrote:
Qualcuno avrebbe idea di come risolvere questo problema?

lascia che venga distrutta e ricreata ogni volta la connessione, tanto ci pensa il connection pooling a far sì che anche se tu puoi averne solo una aperta per volta, per un datareader, in effetti a livello fisico le cose siano ben diverse.
in sintesi, se usi C# guarda questo:
http://www.aspitalia.com/script/605/UsingDisposeAutomaticoCSharp.aspx

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
80 messaggi dal 27 giugno 2001
www.portel.it
Perfetto!
Grazie mille :)

Ciao e buon lavoro
Filippo

--
http://my.opera.com/filippo/

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.