私は複雑なR Shinyアプリケーションを使用していましたが、RracleのバックエンドでR Shinyプールを使用してOracleデータベースに接続していました。私はより単純なバージョンを作ったが、私はまだエラーを再現することができた。データベースプール/接続(いずれか使用されている方)が少し動いているように見えますが、次にランダムに切断されます。大規模なアプリケーションでは、最初に動作し、それ以降のすべての要求は失敗します。このコードはラップトップのRStudioを使って正常に動作しますが、LinuxやR Shiny Proの代わりにWindowsを使って展開しています。私はいつでもPOOL
にdisconnect
と呼んでいません。プールコードがパッケージ内に封入されているR Shiny AppがデータベースからR Shiny Pro
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)
)
)
}
server.R
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%")
)
)
)
ui.R
:
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
オブジェクトを作成しましたが、それを次に直接参照しようとしました。また、openConnection
またはプールのcheckout
を介して直接接続を試みましたが、数回の試行後に両方が切断されました。
## In your pool function, put maximum connection in drv as below
drv = ROracle::Oracle(max.con=128)
はまた、常にプールは接続をリークすると、多くの場合、問題がある:
レスポンスありがとうございますが、max.conはOracleのパラメタではないようですが、プールのデフォルト値はInfです。 lapplyを呼び出すと使用可能な接続がすべて閉じられ、より高速な障害が発生しているようです。 – ysaletore