Невозможно выделить новое соединение: 16 соединений уже открыты RMySQL

Я очень плохо знаком с блестящим и R, но с помощью блестящего я пытаюсь подключиться к базе данных, чтобы получить данные оттуда. Когда я пытаюсь получить доступ к моей работе RShiny в браузере постоянно, я получаю сообщение об ошибке, как Cannot allocate a new connection: 16 connections already opened, Как я могу преодолеть эту ошибку, или Rshine ожидает только 16 пользователей одновременно? У меня есть еще один стековый пост здесь RStudio Shiny Error mysqlNewConnection maxinum из 16 соединений, но объяснение не было понятно по вышеуказанному URL.

3 ответа

Решение

Может быть, вы открываете новое соединение с БД с 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)
}

Надеюсь, это поможет!

Быстрое решение

Если у вас возникла эта проблема, вы должны сначала запустить следующий код в интерактивном режиме, чтобы отключить все ваши подключения к базе данных MySQL:

lapply(dbListConnections(MySQL()), dbDisconnect)

(Обратите внимание, что вы можете заменить MySQL() другим драйвером DBI, если вы используете другую систему управления базами данных).

Более быстрое решение

Просто перезапустите сеанс R: command/ctrl + shift + F10 на RStudio

Как избежать этой проблемы

Вы должны рассказать блестяще, как правильно отключиться. Эта часть зависит от варианта использования. Если вы начинаете соединение каждый раз, когда начинаете блестеть, вы можете добавить внутрь server.ui:

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

Где кон это ваша связь. Если вы запускаете соединение каждый раз, когда запускаете запрос, вы должны отключиться сразу после выполнения запроса.

Вы также должны взглянуть на pool пакет, который предлагается блестящей командой для управления связями. Есть также очень полезный раздел о блестящих статьях в базе данных.

dbDisconnect() не работал в моем случае. Поэтому я остановил MySQL сервер из терминала и снова начал использовать

sudo service mysql stop

sudo service mysql start

Затем я запустил код с помощью dbDisconnect(), теперь он работает для меня.

Другие вопросы по тегам