2015-08-21 259 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的非常有用的部分。