es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aumentar el intento de conexión con DBI

Estoy tratando de construir una aplicación Shiny que estará conectada a una base de datos PostgreSQL inestable con DBI. Funciona bien cuando la base de datos está estable, pero muestra el error de “Whitelabel Error” cuando la base de datos está lenta o caída por un momento. ¿Cómo puedo configurar mi aplicación para que intente conectarse varias veces antes de lanzar el error? A continuación se muestra un código de muestra:

“`{r}
library(shiny)
library(DBI)

con <- dbConnect(
RPostgres::Postgres(),
host = "miip",
port = "miport",
dbname = "midb",
user = "usuario",
password = "contraseña"
)

ui <- fluidPage(
tableOutput("mitabla")
)

server <- function(input, output, session){
output$mitabla <- renderTable(
dbGetQuery(
con,
"select * from mitabla;"
)
)
}

shinyApp(ui, server)
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes usar un bloque tryCatch para intentar conectar a la base de datos varias veces antes de generar un error. Aquí tienes una modificación de ejemplo a tu código:

    “`{r}
    library(shiny)
    library(DBI)

    ui <- fluidPage(
    tableOutput(“mytable”)
    )

    server <- function(input, output, session){

    # Función para intentar conectar a la base de datos
    connect_to_db <- function(){
    dbConnect(
    RPostgres::Postgres(),
    host = “miip”,
    port = “miport”,
    dbname = “midb”,
    user = “usuario”,
    password = “contraseña”
    )
    }

    # Intentar conectar a la base de datos 10 veces con un retraso
    con <- tryCatch({
    for(i in 1:10){
    print(paste0(“Intento #”, i))
    db <- connect_to_db()
    if(!is.null(db)){
    break
    }
    Sys.sleep(5)
    }
    db
    }, error = function(e){
    NULL
    })

    # Mostrar mensaje de error si la conexión falla
    if(is.null(con)){
    output$mytable <- renderText(“Error: No se puede conectar a la base de datos”)
    } else {
    output$mytable <- renderTable(
    dbGetQuery(
    con,
    “select * from mitabla;”
    )
    )
    }
    }

    shinyApp(ui, server)
    “`

    Este código intenta conectar a la base de datos 10 veces con un retraso de 5 segundos entre cada intento. Si no logra conectarse después de 10 intentos, mostrará un mensaje de error. Si se conecta correctamente, mostrará la tabla como antes.

Comments are closed.