2017-10-26 27 views
1

私は複雑なR Shinyアプリケーションを使用していましたが、RracleのバックエンドでR Shinyプールを使用してOracleデータベースに接続していました。私はより単純なバージョンを作ったが、私はまだエラーを再現することができた。データベースプール/接続(いずれか使用されている方)が少し動いているように見えますが、次にランダムに切断されます。大規模なアプリケーションでは、最初に動作し、それ以降のすべての要求は失敗します。このコードはラップトップのRStudioを使って正常に動作しますが、LinuxやR Shiny Proの代わりにWindowsを使って展開しています。私はいつでもPOOLdisconnectと呼んでいません。プールコードがパッケージ内に封入されている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) 

はまた、常にプールは接続をリークすると、多くの場合、問題がある:

答えて

1

はあなたが行うことができますいくつかのことをあります。したがって、あなたの場合、私はそれがデフォルトで16である最大接続に達していると思います。これを避けるには、データがOracleデータベースからロードされた後、次の行を使用することをお勧めします。これにより漏れた接続がすべて削除されます。

lapply(dbListConnections(Oracle()), dbDisconnect) 
+0

レスポンスありがとうございますが、max.conはOracleのパラメタではないようですが、プールのデフォルト値はInfです。 lapplyを呼び出すと使用可能な接続がすべて閉じられ、より高速な障害が発生しているようです。 – ysaletore