由于我不熟悉Shiny,我对自动数据库查询的最佳实践感兴趣。在撰写本文时,有许多不同的来源有不同的信息。
如果我每10分钟查询一次我的postgres数据库,如下例所示,我想确保a)在会话退出时关闭连接并且b)由于太多而无法连接许多开放的联系。我的仪表板将来一次最多可以容纳十几个用户。
做了一些研究之后,我确信最好的方法不一定是使用池,而是使用Shiny here记录的“每个查询一个连接”方法
正在使用reactivePoll()
以下正确的方法来实现一个每10分钟刷新一次渲染表的查询?我将要查询的数据库肯定会在每次调用时返回不同的数据。这是否意味着checkFunc
和valueFunc
应该相同,或者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)