Ho un servizio .NET 4 C# che utilizza le librerie TPL per il threading. Di recente l'abbiamo utilizzato anche per utilizzare il pool di connessioni, poiché una connessione stava diventando un collo di bottiglia per l'elaborazione.Database pooling pooling con servizio multi-thread
In precedenza, stavamo usando una clausola di blocco per controllare la sicurezza del thread sull'oggetto di connessione. Poiché il lavoro eseguiva il backup, la coda esisteva come attività e molti thread (attività) sarebbero in attesa sulla clausola di blocco. Ora, nella maggior parte degli scenari, i thread attendono l'I/O del database e i processi di lavoro MOLTO più velocemente.
Tuttavia, ora che sto usando il pool di connessioni, abbiamo un nuovo problema. Una volta raggiunto il numero massimo di connessioni (100 di default), se vengono richieste ulteriori connessioni, si verifica un timeout (vedere Pooling info). Quando ciò accade, viene generata un'eccezione dicendo "Timeout della richiesta di connessione".
Tutti i miei IDisposables utilizzano le istruzioni e gestisco correttamente le mie connessioni. Questo scenario si verifica a causa della richiesta di più lavoro rispetto a quella che il pool può elaborare (che è previsto). Capisco perché questa eccezione è lanciata e sono consapevole dei modi di gestirla. Un semplice tentativo si sente come un hack. Mi rendo anche conto che posso aumentare il periodo di timeout tramite la stringa di connessione, tuttavia non mi sembra una soluzione solida. Nel progetto precedente (senza raggruppamento), gli elementi di lavoro venivano elaborati a causa del blocco all'interno dell'applicazione.
Qual è un buon modo di gestire questo scenario per garantire che tutto il lavoro venga elaborato?
puoi pubblicare alcuni dei tuo codice? Sarebbe utile vedere come stai creando e pianificando le attività. –
Le attività vengono create più o meno così: Task.Factory.StartNew (() => ProcessItem (item)); Non sto tenendo traccia degli oggetti compito abbastanza da limitare la creazione di compiti (se è questa la strada che stavi pensando). Non tutte le attività richiedono il lavoro del database e non tutto il lavoro del database utilizza lo stesso database (ce ne sono molte diverse, oracle, mssql, ecc.). –
È in grado di gestire i sovraccarichi in fase di caricamento, oppure le richieste vengono costantemente inviate troppo velocemente per essere elaborate? Se è il caso, dovrai ammettere la sconfitta e il fallimento a un certo punto. –