【问题标题】:Cannot allocate a new connection: 16 connections already opened RMySQL无法分配新连接:已打开 16 个连接 RMySQL
【发布时间】:2015-11-15 08:32:27
【问题描述】:

我对 Shiny 和 R 非常陌生,但是我正在尝试使用 Shiny 连接到数据库从那里获取数据。当我尝试在浏览器上连续访问我的 RShiny 作品时,我收到了类似 Cannot allocate a new connection: 16 connections already opened 的错误。我怎样才能克服这个错误或 RShiny 一次只能期待 16 个用户?我在这里有另一个堆栈帖子RStudio Shiny Error mysqlNewConnection maximum of 16 connections,但上面的 URL 上的解释不清楚。

【问题讨论】:

  • 您是否需要同时打开 16 个以上的连接,或者您正在寻找关闭未使用连接的方法?如果是前者,this blog post 似乎提供了一个解决方案。
  • shinyServer之前打开一个连接,一直使用这个连接。

标签: r shiny rmysql


【解决方案1】:

也许您每次在代码中发送查询时都会使用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."))

}

我建议在 shiny 之外编写一个小函数来处理整个打开和关闭的事情:

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)
}

希望有帮助!

【讨论】:

  • 谢谢@ThankGoat。这真的很有帮助并解决了这个问题。但是你能解释一下我从哪里得到所有这些的正确文档吗?
  • 这一切都在 RMySQL 包的文档中。只需在控制台中输入?RMySQL 并开始阅读;)
  • 我强烈建议在DB &lt;- dbConnect 之后使用on.exit(dbDisconnect(DB))。否则查询语法错误将使连接保持打开状态。
  • 不错的@Marek。只是相应地编辑了答案!
  • killDBconnections 功能很好。如果您想要快速修复。此解决方案proposed in a comment here 还将断开所有 MySQL 连接:RMySQL::dbDisconnect(RMySQL::dbListConnections(RMySQL::MySQL())[[1]])。要断开所有连接,请交互运行几次。
【解决方案2】:

快速解决方案

如果您遇到此问题,您应该首先以交互方式运行以下代码以断开与 MySQL 数据库的所有连接:

lapply(dbListConnections(MySQL()), dbDisconnect)

(请注意,如果您使用其他数据库管理系统,可以将 MySQL() 替换为其他 DBI 驱动程序)。

更快的解决方案

只需重新启动 R 会话:RStudio 上的command/ctrl + shift + F10

如何避免这个问题

您需要告诉闪亮如何正确断开连接。那部分取决于用例。如果你每次开始闪亮时都开始一个连接,你可以在server.ui里面添加:

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

con 是您的连接。 如果每次运行查询时都启动连接,则必须在查询运行后立即断开连接。

您还应该查看由闪亮团队提供的poolsuggested 来管理连接。 在数据库中Shiny Articles 上还有一个非常有用的部分。

【讨论】:

  • 如果您在内存中加载了大型数据集,“更快”的解决方案实际上非常慢...
【解决方案3】:

dbDisconnect() 在我的情况下不起作用。所以我从终端停止了 MySQL 服务器并再次开始使用

sudo 服务 mysql 停止

sudo 服务 mysql 启动

然后我使用 dbDisconnect() 运行代码,现在它对我有用。

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2011-09-18
    • 2012-02-23
    • 2015-09-11
    • 2015-09-03
    • 2010-12-01
    • 2014-05-08
    • 2012-10-12
    相关资源
    最近更新 更多