Informazioni di background
Ho un'app web che fornisce all'utente la consueta funzionalità CRUD per "widget", diciamo. Ma ho anche dato loro la possibilità di creare widget in blocco tramite l'importazione di file CSV. La logica che ho adesso funziona, ma l'ambito dell'applicazione è appena cresciuto. Oltre a scrivere i record sul db principale, mi è stato chiesto di scrivere i dati del widget su altri 4 database utilizzati da un'altra applicazione. (i 4 database appartengono tutti a un'app business, che non deve essere separata, ma non posso cambiarla in questo momento).
Codice
Il codice che sto usando in questo momento assomiglia a questo (pseudocodice):
open file
loop through all records in csv file
for each record
connect to main db
insert into main db
for each widget_manager app server
connect
insert
disconnect
if at any time there is a failure with any insert
rollback all inserts.
end
end
disconnect main db
end
problema
Attualmente, a seconda delle dimensioni del file csv, mentre l'importazione sta eseguendo il database è bloccato. Non riesco a selezionare nulla o utilizzare altre pagine nell'app.
Domanda / obiettivi
Ho in mente tre obiettivi:
- previene il blocco se possibile.
- fornire un feedback in tempo reale all'utente finale per dimostrare che qualcosa sta accadendo ... posso farlo per ogni record mentre viene aggiunto? in questo momento, io uso una chiamata Ajax ma, naturalmente, i risultati vengono visualizzati solo alla fine del ciclo for, quando tutti i record sono stati conteggiati. Ho una gif animata che viene eseguita per tutta la durata dell'importazione, che è utile. Ma sarebbe bello se potessi mostrare i record che vengono aggiunti in qualche modo. Attualmente sto rivedendo il seguente post: link
per vedere come funzionerebbero le cose se guidassi la logica di importazione sul lato client ... Finora, non sono sicuro di quali sarebbero i benefici / rischi.
- semplificare il codice suddividendolo in più funzioni. Ad esempio, invece di avere solo un pulsante chiamato "import" che fa tutto, hanno due pulsanti. Uno chiamato "import to main db" e l'altro "import to widget manager" o qualcosa del genere. L'ultimo è ciò che aggiornerà i 4 nuovi database in cui devo scrivere. Nota: va bene se il record esiste nell'app principale, ma l'inserimento nel gestore di widget fallisce. Devo solo prenderne nota nei log. Ancora una volta, un altro requisito per le imprese negative, ma non ne ho il controllo.
- L'altra idea che avevo era di limitare a livello di codice la dimensione del file al numero "n" di record. Ma non sono sicuro che ciò infastidirà o meno gli utenti finali.
Se vedi un problema con l'approccio che sto considerando, faccelo sapere. Inoltre, se hai qualche idea su come posso fornire un feedback in tempo reale ... sarebbe fantastico.
open file
loop through all records in csv file
for each record
connect to main db
START TX on main db *****
insert into main db
for each widget_manager app server
connect
insert
disconnect
if at any time there is a failure with any insert
rollback all inserts.
end
end
END TX on main db *****
disconnect main db
end