[英]R Shiny App Disconnects from Database In R Shiny Pro
我有一个复杂的 R Shiny 应用程序,我在其中使用带有 ROracle 后端的 R Shiny 池连接到 Oracle 数据库。 我做了一个更简单的版本,我仍然能够重现错误。 数据库池/连接,无论使用哪个,似乎工作了一下,然后随机断开连接。 在较大的应用程序中,它第一次工作,所有后续请求都失败。 该代码通过我笔记本电脑上的 RStudio 运行良好,尽管它是通过 Windows 而不是 Linux 和 R Shiny Pro 部署的。 我不会在任何时候在POOL
上调用disconnect
。
用户界面
library(shiny)
library(shinythemes)
library(dplyr)
library(readr)
ui <- fluidPage(theme = shinytheme("lumen"),
titlePanel("Google Trend Index"),
sidebarLayout(
sidebarPanel(
),
mainPanel(
DT::dataTableOutput("db_studies", width = "100%"),
DT::dataTableOutput("db_studies2", width = "100%")
)
)
)
服务器
library(DT)
POOL <<- MyDB::openPool()
server <- function(input, output, session) {
output$db_studies <- DT::renderDataTable(
DT::datatable(
DBI::dbReadTable(POOL, "STUDY") %>%
data.table::data.table() %>%
dplyr::arrange(desc(DATE_CREATED)),
)
)
output$db_studies2 <- DT::renderDataTable(
DT::datatable(
dplyr::tbl(POOL, "SAMPLE") %>%
dplyr::filter(DATASET_ID %in% 57) %>%
dplyr::collect(n = Inf)
)
)
}
池代码封装在一个包中:
openPool <- function(..., keyFilename = "db_key.RData",
credentialsFilename = "db_login.txt",
connectionInfoFilename = "db_connection.Rdata") {
credentials <- getCredentials(keyFilename = keyFilename, filename = credentialsFilename)
connectionInfo <- getConnectionInfo(filename = connectionInfoFilename)
POOL <- pool::dbPool(...,
drv = ROracle::Oracle(),
dbname = paste(
"(DESCRIPTION=",
"(ADDRESS=(PROTOCOL=tcp)",
"(HOST=", connectionInfo$host, ")",
"(PORT=", connectionInfo$port, "))",
"(CONNECT_DATA=(SID=", connectionInfo$sid, ")))", sep = ""),
host = connectionInfo$host,
port = connectionInfo$port,
username = credentials$username,
password = credentials$password
)
POOL
}
该包的目的是分离出数据库凭据和处理,但对于上面的简单测试,我直接查询数据库,但在几次刷新后,数据库池仍然无效并失败。
我最初实例化了POOL
对象,然后将其传递POOL
。 看到所有示例都没有这样做,我创建了一个全局POOL
对象,然后我尝试直接引用它。 我还尝试使用直接连接,无论是通过openConnection
还是通过池的checkout
,尝试几次后都断开连接。
您可以做以下几件事:
## In your pool function, put maximum connection in drv as below
drv = ROracle::Oracle(max.con=128)
此外,池泄漏连接总是存在问题。 因此,在您的情况下,我认为它已达到最大连接数,默认情况下为 16。 为避免这种情况,我建议在从 oracle 数据库加载数据后使用以下行。 这将删除所有泄漏的连接。
lapply(dbListConnections(Oracle()), dbDisconnect)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.