Come implementare una routine di pulizia in R Shiny?

Ad esempio, la mia app lucida potrebbe aprire una connessione DB

# server.R db <- dbConnect("SQLite", DB_PATH) shinyServer( ... # things involving db ) 

Ora, come assicurarsi che la connessione db sia chiusa correttamente (tramite dbDisconnect(db) ) quando termina la sessione di Shiny? In effetti, dovrebbe essere eseguita la pulizia per ogni client che si connette al server, o solo una volta?

Ho semplicemente paura che con più utenti che si collegano e si disconnettono continuamente dall’app Shiny, lasceranno penzoloni i collegamenti DB se non vengono ripuliti correttamente. In effetti, i clienti possono disconnettersi senza preavviso semplicemente chiudendo i loro browser.

Il modo corretto per farlo è assegnare una funzione che esegua la pulizia con session$onSessionEnded . Ad esempio, in server.R:

 cancel.onSessionEnded <- session$onSessionEnded(function() { dbDisconnect(db) }) 

È quindi ansible chiamare cancel.onSessionEnded per annullare l'assegnazione.

Le risposte preesistenti non mi sembrano giuste.

  • session$onSessionEnded potrebbe chiudere la connessione quando ogni utente si disconnette, ma nella domanda originale esiste una sola connessione per tutti gli utenti. Soprattutto quando si utilizza pool , non si desidera avviare / interrompere connessioni separate per ciascun utente.
  • on.exit viene eseguito immediatamente, non è in attesa che il server esca.

Penso che la risposta corretta sia usare onStop ( https://shiny.rstudio.com/reference/shiny/latest/onStop.html ).

Esempio di utilizzo, dalla documentazione:

 library(shiny) shinyApp( ui = basicPage("onStop demo"), server = function(input, output, session) { onStop(function() cat("Session stopped\n")) }, onStart = function() { cat("Doing application setup\n") onStop(function() { cat("Doing application cleanup\n") }) } ) 

Rstudio ha pubblicato a giugno una serie di articoli sulle migliori pratiche per connettersi a un database. La semplice risposta è usare le piscine (vedi qui e qui ). Per renderlo semplice, definisci il tuo pool una volta, e gestirà e gestirà le connessioni, aprendole e chiudendole secondo necessità. Una volta scollegata l’app, il pool chiuderà automaticamente tutte le connessioni.

Sfortunatamente, il pacchetto del pool non funziona con SQL Server e ODBC. Per tale situazione (o se non si desidera utilizzare il pool), si consiglia di utilizzare on.exit all’interno delle funzioni del server s .

per esempio:

 getData <- reactive({ cnxn <- dbConnect(...) on.exit(dbDisconnect(cnxn)) ... # your stuff here }) 

È ansible utilizzare on.exit(dbDisconnect(db)) all’interno della definizione della funzione shinyServer.