come importare grandi quantità di dati senza bloccare il database sqlite

2

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:

  1. previene il blocco se possibile.
  2. 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.

  1. 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.
  2. 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
    
posta dot 06.05.2015 - 22:41
fonte

0 risposte