我正在通过odbc
中的Shiny
支持从MS SQL数据库中获取数据。我想避免在每个反应函数中重复此con
函数,而只需运行一次并使用它。因此,我将其放在服务器功能中,如:
server <- function(input, output, session){
con <- dbConnect(odbc(),
Driver = "MSODBC",
Server = "myserver",
Database = "mydatabase",
UID = "User",
PWD = "Pass",
encoding = "windows-1252",
Port = 1433)
on.exit(odbc::dbDisconnect(con))
main <- reactive({
squery = dbSendQuery(con,"myQuery",stringsAsFactors = FALSE)
parameterNmaes = dbFetch(squery )
result= list(parameterNmaes = parameterNmaes)
return(result)
})
}
但是这不起作用,并且出现以下错误:
Warning: Error in new_result: external pointer is not valid
82: <Anonymous>
通过将con
函数放入反应函数main
中,一切都很好:
server <- function(input, output, session){
main <- reactive({
con <- dbConnect(odbc(),
Driver = "MSODBC",
Server = "myserver",
Database = "mydatabase",
UID = "User",
PWD = "Pass",
encoding = "windows-1252",
Port = 1433)
on.exit(odbc::dbDisconnect(con))
squery = dbSendQuery(con,"myQuery",stringsAsFactors = FALSE)
parameterNmaes = dbFetch(squery )
result= list(parameterNmaes = parameterNmaes)
return(result)
})
}
即使我尝试导出con
函数作为结果,也可以在其他反应式函数中使用它,如:
result= list(parameterNmaes = parameterNmaes, con = con)
sub1 <- reactive({
con <- main()$con
})
但是我遇到了同样的错误!到目前为止,唯一的解决方案是在所有无功函数中重复con
函数!防止这种无意义的重复数据库连接的任何明智的想法将不胜感激。
如果您运行这个小应用程序:
library(shiny)
ui <- fluidPage()
server <- function(input, output, session){
on.exit(cat("hello"))
}
shinyApp(ui, server)
然后,只要应用启动,您就会在R控制台中看到“ hello”字样。这是因为Shiny已完成执行server
功能。因此,只要应用启动,就会在您的应用中执行dbDisconnect
。
我会尝试
server <- function(input, output, session){
con <- dbConnect(odbc(),
Driver = "MSODBC",
Server = "myserver",
Database = "mydatabase",
UID = "User",
PWD = "Pass",
encoding = "windows-1252",
Port = 1433)
onStop(function() odbc::dbDisconnect(con))
main <- reactive({
squery = dbSendQuery(con,"myQuery",stringsAsFactors = FALSE)
parameterNmaes = dbFetch(squery )
result= list(parameterNmaes = parameterNmaes)
return(result)
})
}