Shiny中自动数据库查询的最佳实践

the*_*ide 5 r shiny shiny-server

由于我不熟悉Shiny,我对自动数据库查询的最佳实践感兴趣.在撰写本文时,有许多不同的来源有不同的信息.

如果我每隔10分钟查询一次我的postgres数据库,如下例所示,我想确保a)在会话退出时关闭连接并且b)由于打开的连接太多而无法连接.我的仪表板将来一次最多可容纳十几个用户.

已经做了一些研究,我相信,最好的办法做到这一点是不是一定要使用游泳池,但使用"每次查询一个连接"的方式闪亮记载这里

使用reactivePoll(),因为我有正确的方法下面来实现查询,将刷新渲染表每10分钟?我将要查询的数据库肯定会在每次调用时返回不同的数据.这是否意味着, checkFuncvalueFunc应该是相同的或者可以checkFunc将其保留为完全空的功能?

library(shiny)
library(DBI)

args <- list(
  drv = dbDriver("PostgreSQL"),
  dbname = "shinydemo",
  host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
  username = "guest",
  password = "guest"
)

ui <- fluidPage(
  textInput("ID", "Enter your ID:", "5"),
  tableOutput("tbl"),
  numericInput("nrows", "How many cities to show?", 10),
  plotOutput("popPlot")
)

server <- function(input, output, session) {
  output$tbl <- renderTable({
    conn <- do.call(DBI::dbConnect, args)
    on.exit(DBI::dbDisconnect(conn))

    sql <- "SELECT * FROM City WHERE ID = ?id;"
    query <- sqlInterpolate(conn, sql, id = input$ID)

    data <- reactivePoll(10000, session,
   checkFunc = function() {}
   valueFunc = function() {
  dbGetQuery(conn, query)
     })
  })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

小智 1

我建议从任何输出对象中创建数据库连接“conn”。

args <- list(
  drv = dbDriver("PostgreSQL"),
  dbname = "shinydemo",
  host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
  username = "guest",
  password = "guest"
)
conn <- do.call(DBI::dbConnect, args)
Run Code Online (Sandbox Code Playgroud)

它可以是一个全局环境对象,例如示例代码中的“args”列表,或者在服务器函数内部,呈现的输出对象中的查询都将访问相同的“conn”数据库连接。根据我的经验,没有必要包括断开连接,在关闭带有 Shiny 应用程序的 Rsession 后,数据库也会断开连接。