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

ano*_*oop 21 r rmysql shiny

我对光亮和R非常新,但是使用闪亮的我试图连接到数据库从那里获取数据.当我试图在浏览器上连续访问我的RShiny工作时,我得到了一个错误Cannot allocate a new connection: 16 connections already opened.我怎样才能克服这个错误或者Rshine一次只能期待16个用户?我有另一个堆栈帖子在这里RStudio闪亮错误mysqlNewConnection最大16个连接,但解释上面的网址不清楚.

Tha*_*oat 45

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."))

}
Run Code Online (Sandbox Code Playgroud)

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

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)
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 我强烈建议在`DB < - dbConnect`之后使用`on.exit(dbDisconnect(DB))`.否则查询语法错误将打开连接. (2认同)

Kev*_*rca 11

快速解决方案

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

lapply(dbListConnections(MySQL()), dbDisconnect)
Run Code Online (Sandbox Code Playgroud)

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

更快的解决方案

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

如何避免这个问题

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

session$onSessionEnded(function(){
    dbDisconnect(con)
}
Run Code Online (Sandbox Code Playgroud)

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

您还应该看看闪亮团队建议pool包管理连接.关于数据库的Shiny Articles还有一个非常有用的部分.