由于我刚开始使用Shiny进行开发,我对自动化数据库查询的最佳实践非常感兴趣。目前有许多不同来源的信息。
如果我像下面的示例一样每10分钟查询我的postgres数据库,我想确保没有以下问题:a)在会话退出时关闭连接和b)由于太多打开的连接而无法连接。我的仪表板将来最多会有十几个用户同时使用。
经过一些研究,我相信最好的方法不一定是使用池,而是使用Shiny文档中记录的“每次查询一个连接”的方法
像下面这样使用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)