关闭 R Shiny App 时断开与 PostgreSQL 的连接
Disconnect from PostgreSQL when close R Shiny App
诚然,此问题与 this question 类似,但所提供的答案对于我的示例而言还不够。
我正在创建一个连接到数据库的闪亮应用程序。用户可以提供一些输入,一些 'canned' 查询将 运行。现在,我想确保在退出应用程序时关闭与数据库的连接。我可以使用按钮和 stopApp
功能,但这假设用户会很好并且总是单击所述按钮。用户有时可能会关闭 window 而使数据库连接保持打开状态,因此我想找到一种方法在用户关闭应用程序 window.
时显式关闭连接
我想一种解决方案是实例化一个新连接并在每个查询结束时关闭,但这似乎效率不高。
这里是一些演示问题的工作代码。如果我从 Rstudio 运行 这个应用程序然后关闭 window,我仍然有一个现有的连接 dbListConnections(PostgreSQL())
。将 dbDisconnect(con)
附加到文件末尾没有帮助。
library(shiny)
library(RPostgreSQL)
server <- shinyServer(function(input, output){
# Read in the dataset
connectDB <- eventReactive(input$connectDB, {
if(input$drv != "postgresql"){
stop("Only 'postgresql' implemented currently")
}else{
drv <- dbDriver("PostgreSQL")
port = 5432
}
con <- dbConnect(drv, user = input$user, password = input$passwd,
port = port, host = input$server, dbname=input$db_name)
con
})
output$test <- renderText({
con <- connectDB()
"connection success"
})
})
ui <- shinyUI(
fluidPage(
titlePanel("Test Connection"),
sidebarLayout(
sidebarPanel(
textInput("drv", "Database Driver", value="postgresql"),
textInput("user", "User ID"),
textInput("server", "Server", value="server"),
textInput("db_name", "Database Name", value="dbName"),
passwordInput("passwd", "Password"),
actionButton("connectDB", "Connect to DB")
),
mainPanel(
textOutput("test")
)
)
)
)
shinyApp(ui=ui, server=server)
你知道session
变量的onSessionEnded
吗?
这是一个非常基本的示例,它为每个用户设置了一个随机会话 ID,当他们关闭 window 时,会运行一个函数来说明哪个会话 ID 已关闭。这只是一个概念证明,我希望您可以根据您的数据库需求对其进行微不足道的定制
runApp(shinyApp(
ui = fluidPage(
textOutput("sessionId")
),
server = function(input, output, session) {
sessionId <- as.integer(runif(1, 1, 100000))
output$sessionId <- renderText(paste0("Session id: ", sessionId))
session$onSessionEnded(function() {
cat(paste0("Ended: ", sessionId))
})
}
))
编辑:
Op 说他需要这个变量是反应性的,所以我相信这里有一个修改可以让他得到他想要的东西
runApp(shinyApp(
ui = fluidPage(
textOutput("sessionId")
),
server = function(input, output, session) {
values <- reactiveValues(sessionId = NULL)
values$sessionId <- as.integer(runif(1, 1, 100000))
output$sessionId <- renderText(paste0("Session id: ", values$sessionId))
session$onSessionEnded(function() {
observe(cat(paste0("Ended: ", values$sessionId)))
})
}
))
免责声明:我不确定将观察放在 onSessionEnded 回调中是否是最好的方法。这行得通,但我不能保证它是 "correctness".
诚然,此问题与 this question 类似,但所提供的答案对于我的示例而言还不够。
我正在创建一个连接到数据库的闪亮应用程序。用户可以提供一些输入,一些 'canned' 查询将 运行。现在,我想确保在退出应用程序时关闭与数据库的连接。我可以使用按钮和 stopApp
功能,但这假设用户会很好并且总是单击所述按钮。用户有时可能会关闭 window 而使数据库连接保持打开状态,因此我想找到一种方法在用户关闭应用程序 window.
我想一种解决方案是实例化一个新连接并在每个查询结束时关闭,但这似乎效率不高。
这里是一些演示问题的工作代码。如果我从 Rstudio 运行 这个应用程序然后关闭 window,我仍然有一个现有的连接 dbListConnections(PostgreSQL())
。将 dbDisconnect(con)
附加到文件末尾没有帮助。
library(shiny)
library(RPostgreSQL)
server <- shinyServer(function(input, output){
# Read in the dataset
connectDB <- eventReactive(input$connectDB, {
if(input$drv != "postgresql"){
stop("Only 'postgresql' implemented currently")
}else{
drv <- dbDriver("PostgreSQL")
port = 5432
}
con <- dbConnect(drv, user = input$user, password = input$passwd,
port = port, host = input$server, dbname=input$db_name)
con
})
output$test <- renderText({
con <- connectDB()
"connection success"
})
})
ui <- shinyUI(
fluidPage(
titlePanel("Test Connection"),
sidebarLayout(
sidebarPanel(
textInput("drv", "Database Driver", value="postgresql"),
textInput("user", "User ID"),
textInput("server", "Server", value="server"),
textInput("db_name", "Database Name", value="dbName"),
passwordInput("passwd", "Password"),
actionButton("connectDB", "Connect to DB")
),
mainPanel(
textOutput("test")
)
)
)
)
shinyApp(ui=ui, server=server)
你知道session
变量的onSessionEnded
吗?
这是一个非常基本的示例,它为每个用户设置了一个随机会话 ID,当他们关闭 window 时,会运行一个函数来说明哪个会话 ID 已关闭。这只是一个概念证明,我希望您可以根据您的数据库需求对其进行微不足道的定制
runApp(shinyApp(
ui = fluidPage(
textOutput("sessionId")
),
server = function(input, output, session) {
sessionId <- as.integer(runif(1, 1, 100000))
output$sessionId <- renderText(paste0("Session id: ", sessionId))
session$onSessionEnded(function() {
cat(paste0("Ended: ", sessionId))
})
}
))
编辑:
Op 说他需要这个变量是反应性的,所以我相信这里有一个修改可以让他得到他想要的东西
runApp(shinyApp(
ui = fluidPage(
textOutput("sessionId")
),
server = function(input, output, session) {
values <- reactiveValues(sessionId = NULL)
values$sessionId <- as.integer(runif(1, 1, 100000))
output$sessionId <- renderText(paste0("Session id: ", values$sessionId))
session$onSessionEnded(function() {
observe(cat(paste0("Ended: ", values$sessionId)))
})
}
))
免责声明:我不确定将观察放在 onSessionEnded 回调中是否是最好的方法。这行得通,但我不能保证它是 "correctness".