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

时间:2015-08-21 11:50:42

标签: r shiny rmysql

我对光亮和R非常新,但是使用闪亮的我试图连接到数据库从那里获取数据。当我尝试在浏览器上连续访问我的RShiny工作时,出现了Cannot allocate a new connection: 16 connections already opened之类的错误。我怎样才能克服这个错误或RShiny一次只能期待16个用户?我在这里有另一个堆栈帖子RStudio Shiny Error mysqlNewConnection maximum of 16 connections,但上述网址上的说明并不清楚。

3 个答案:

答案 0 :(得分:42)

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

希望有所帮助!

答案 1 :(得分:7)

快速解决方案

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

lapply(dbListConnections(MySQL()), dbDisconnect)

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

更快的解决方案

只需在RStudio上重启R session:command/ctrl + shift + F10

如何避免此问题

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

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

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

您还应该查看闪亮团队pool$select1 = Select-String -Pattern "Final result:" -Path $filePath | Out-File D:\temp\pattern.txt 来管理连接。 关于数据库的suggested还有一个非常有用的部分。

答案 2 :(得分:1)

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

sudo service mysql stop

sudo service mysql start

然后我使用dbDisconnect()运行代码,现在它正在为我工​​作。