繁体   English   中英

R Shiny 应用程序与 R Shiny Pro 中的数据库断开连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM