the*_*ide 5 r shiny shiny-server
由于我不熟悉Shiny,我对自动数据库查询的最佳实践感兴趣.在撰写本文时,有许多不同的来源有不同的信息.
如果我每隔10分钟查询一次我的postgres数据库,如下例所示,我想确保a)在会话退出时关闭连接并且b)由于打开的连接太多而无法连接.我的仪表板将来一次最多可容纳十几个用户.
已经做了一些研究,我相信,最好的办法做到这一点是不是一定要使用游泳池,但使用"每次查询一个连接"的方式闪亮记载这里
使用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)
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 后,数据库也会断开连接。