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

5

由于我刚开始使用Shiny进行开发,我对自动化数据库查询的最佳实践非常感兴趣。目前有许多不同来源的信息。

如果我像下面的示例一样每10分钟查询我的postgres数据库,我想确保没有以下问题:a)在会话退出时关闭连接和b)由于太多打开的连接而无法连接。我的仪表板将来最多会有十几个用户同时使用。

经过一些研究,我相信最好的方法不一定是使用池,而是使用Shiny文档中记录的“每次查询一个连接”的方法

像下面这样使用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)
1个回答

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)

它可以是一个全局环境对象,就像你示例代码中的 'args' 列表一样,或者在服务器函数内部,呈现输出对象中的查询将全部访问相同的 'conn' 数据库连接。根据我的经验,在关闭与 Shiny 应用程序的 Rsession 后,不需要包含断开连接,数据库也会断开连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接