¿Cómo implementar una rutina de limpieza en R Shiny?

Por ejemplo, mi shiny aplicación podría abrir una conexión DB

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

Ahora, ¿cómo garantizar que la conexión db se cierra correctamente (a través de dbDisconnect(db) ) cuando finaliza la sesión Shiny? De hecho, ¿se debería realizar la limpieza para cada cliente que se conecta al servidor, o solo una vez?

Simplemente temo que con múltiples usuarios conectando y desconectando a la aplicación Shiny todo el tiempo, dejarán conexiones DB vacías si no se limpian adecuadamente. De hecho, los clientes pueden desconectarse sin previo aviso simplemente cerrando sus navegadores.

La forma correcta de hacerlo es asignar una función que realice la limpieza con la session$onSessionEnded . Por ejemplo, en server.R:

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

A continuación, puede llamar a cancel.onSessionEnded para deshacer la asignación.

Las respuestas preexistentes no me parecen correctas.

  • session$onSessionEnded podría cerrar la conexión cuando cada usuario se desconecta, pero en la pregunta original solo hay una conexión para todos los usuarios. Especialmente cuando usa pool , no desea iniciar / detener conexiones separadas para cada usuario.
  • on.exit ejecuta inmediatamente, sin esperar hasta que el servidor salga.

Creo que la respuesta correcta es usar onStop ( https://shiny.rstudio.com/reference/shiny/latest/onStop.html ).

Ejemplo de uso, de la documentación:

 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 publicó una serie de artículos en junio sobre las mejores prácticas para conectarse a una base de datos. La respuesta simple es usar pools (ver aquí y aquí ). Para hacerlo simple, usted define su grupo una vez, y manejará y administrará las conexiones, abriendo y cerrando según sea necesario. Una vez que la aplicación se desconecta, el grupo cerrará todas las conexiones automáticamente.

Lamentablemente, el paquete de grupo no funciona con SQL Server y ODBC. Para esa situación (o si no desea usar el grupo), le aconsejan usar on.exit dentro de su función de servidor.

por ejemplo:

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

Puede usar on.exit(dbDisconnect(db)) dentro de su definición de función de shinyServer.