Qui è il problemaSoluzione al problema di lunga esecuzione di query in un'applicazione web (richiesta asincrona)
Un utente di un'applicazione aziendale web sta eseguendo un compito che si traduce in una lunga (lunghissima) query di database (o altro compito intensiva lunga lavorazione)
Problemi:
- richiesta scaduta - dopo un po 'l'utente può ottenere un timeout richiesta timeout
- sessione - se non si utilizzano sessione mantenendo metodi, un ses timeout sione può verificarsi
- richiesta di blocco filo
- dal momento che il thread di richiesta non restituisce, potrebbe bloccare i nuovi requrests (se raggiunge il limite piscina)
- In alcuni server applicativi lo stato di salute del server potrebbe innescare una forzata riavvio del nodo o l'applicazione (a causa di un thread di richiesta lunga esecuzione)
- Se l'utente lascia la pagina:
- la transazione non viene annullata - con conseguente trasformazione inutile nessuno beneficerà
- l'utente non può tornare a vedere i risultati dopo aver completato
- alcuna indicazione progresso - l'utente appena attende la pagina per aggiornare
Ci sono diverse soluzioni che ho trovato, ma non sono sicuro di sapere quale sia il migliore (in tutti gli aspetti, peformance, best practice, eleganza e manutenibilità) e vorrei sapere qual è la soluzione consigliata, e se c'è una soluzione che mi è sfuggita? (Probabilmente sì, e molti)
La cattiva soluzione: utilizzare il thread di richiesta come un thread di lavoro, salvare lo stato di avanzamento della sessione, hanno un AJAX chiamare verificare lo stato (nella sessione) in un altro richiesta parallela
Il compromesso soluzione: creare il proprio pool di thread, gestire un thread di monitoraggio, un thread di lavoro e prendersi cura di clustering sincronizzazione dei stati in una cache transazionale distrubuted o di stoccaggio persistente. questo rilascia la richiesta, ma crea discussioni che il server delle applicazioni non conosce e non chiuderà in annullamento. Sta a te chiudere i thread in modo pulito, e c'è sempre la possibilità che tu finisca per perdere qualcosa. Questo non è il modo J2EE di farlo neanche.
La soluzione J2EE: utilizzare JMS per l'operazione asincrona, questo è quello che è mento per
la soluzione Primavera: l'uso della molla in lotti
Cosa faresti/fatto nei vostri progetti? Quali altre soluzioni sai? quale di quelli che ho notato sopra è il vincitore secondo te?
Risposta ben scritta, grazie –
@Ehrann: Grazie! Implementalo e fammi sapere se hai una soluzione più fluida ... – raoulsson