2015-08-21 302 views
11

我對閃亮和R非常新,但使用閃亮我試圖連接到數據庫從那裏獲取數據。當我嘗試訪問瀏覽器中的RShiny工作時,我得到了一個如Cannot allocate a new connection: 16 connections already opened的錯誤。我如何克服這個錯誤,或者Rshine一次只能期待16個用戶?我在這裏有另外一個帖子RStudio Shiny Error mysqlNewConnection maxinum of 16 connections,但在上面的url中解釋不清楚。無法分配新連接:已連接16個連接RMySQL

+0

您是否需要* 16個連接同時打開,或者您在尋找一種方法來關閉未使用的連接?如果是前者,[這篇博客文章](http://fransvandunne.com/2015/07/allow-for-more-than-16-rmysql-connections-in-r/)似乎提供了一個解決方案。 – nrussell

+0

在'shinyServer'之前打開一個連接並始終使用此連接。 –

回答

30

也許您每次在代碼中發送查詢時都會打開一個與obj <- dbConnect(...)的新數據庫連接。您可以簡單地在您創建的對象上調用dbDisconnect(obj)以在執行查詢後每次都終止相應的連接。

您也可以使用此功能殺死所有打開的連接一次:

library(RMySQL) 

killDbConnections <- function() { 

    all_cons <- dbListConnections(MySQL()) 

    print(all_cons) 

    for(con in all_cons) 
    + dbDisconnect(con) 

    print(paste(length(all_cons), " connections killed.")) 

} 

我推薦寫外面光澤一個小功能,處理整個開閉的事情:

library(RMySQL) 

sqlQuery <- function (query) { 

    # creating DB connection object with RMysql package 
    DB <- dbConnect(MySQL(), user="youruser", password='yourpassword', dbname='yourdb', host='192.168.178.1') 

    # close db connection after function call exits 
    on.exit(dbDisconnect(DB)) 

    # send Query to btain result set 
    rs <- dbSendQuery(DB, query) 

    # get elements from result sets and convert to dataframe 
    result <- fetch(rs, -1) 

    # return the dataframe 
    return(result) 
} 

希望有幫助!

+0

謝謝@ThankGoat。這真的很有幫助,並解決了這個問題。但是,能否請你解釋一下我從哪裏得到了適當的文件。 – anoop

+0

這些都在RMySQL包的文檔中。只需在控制檯輸入'?RMySQL'並開始讀取;} – ThankGoat

+2

我強烈建議在DB < - dbConnect後面使用'on.exit(dbDisconnect(DB))'。否則,查詢語法錯誤將使連接斷開。 – Marek

1

dbDisconnect()在我的情況下不起作用。所以,我已經從終端停止MySQL服務器,並使用

再次啓動sudo的服務mysql的停止

sudo的服務mysql的啓動

然後我跑的代碼使用dbDisconnect()現在它的工作對我來說。

1

如果你這個問題,你應該先運行下面的代碼交互到所有CONNEXIONS斷開與MySQL數據庫:

lapply(dbListConnections(MySQL()), dbDisconnect) 

(請注意,您可以通過另一個DBI驅動程序替換MySQL的(),如果你使用另一個數據庫管理系統)。

然後,你需要明確如何正確斷開連接。這部分取決於用例。如果你每次啓動時閃亮啓動聯接,您可以添加內部server.ui

session$onSessionEnded(function(){ 
    dbDisconnect(con) 
} 

其中con是你的Connexion公司。 如果每次運行查詢時都啓動連接,則必須在查詢運行後立即斷開連接。

您還應該看看pool包裝是由閃亮的團隊suggested管理連接。 數據庫上還有一個關於Shiny Articles的非常有用的部分。