无法分配新连接:16 个连接已打开 RMySQL

Cannot allocate a new connection: 16 connections already opened RMySQL

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

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

希望对您有所帮助!

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

sudo 服务mysql停止

sudo 服务mysql 启动

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

快速解决

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

lapply(dbListConnections(MySQL()), dbDisconnect)

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

更快的解决方案

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

如何避免这个问题

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

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

con 是你的联系人。 如果每次 运行 查询时都启动连接,则必须在查询 运行.

后立即断开连接

您还应该看看 pool 包,它是 shiny 团队 suggested 用来管理连接的。 还有一个关于 Shiny Articles on database.

的非常有用的部分