Невозможно выделить новое соединение: 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(), теперь он работает для меня.