Я очень новичок в блестящей и R, но используя блестящие, я пытаюсь подключиться к базе данных, чтобы получить данные оттуда. Когда я пытаюсь получить доступ к моей работе RShiny в браузере, я получаю ошибку, например Cannot allocate a new connection: 16 connections already opened
. Как я могу преодолеть эту ошибку, или Rshine ожидает только 16 пользователей за раз?. У меня есть еще один столбец здесь RStudio Shiny Ошибка mysqlNewConnection maxinum из 16 подключений, но объяснение не было явным на указанном выше URL-адресе.
Не удается выделить новое соединение: 16 подключений уже открыты RMySQL
Ответ 1
Возможно, вы открываете новое соединение с БД с помощью 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)
}
Надеюсь, что это поможет!
Ответ 2
dbDisconnect() не работал в моем случае. Поэтому я остановил сервер MySQL от терминала и снова начал использовать
sudo service mysql stop
sudo service mysql start
Затем я запустил код с помощью dbDisconnect(), теперь он работает для меня.
Ответ 3
Если у вас возникла эта проблема, вы должны сначала запустить следующий код в интерактивном режиме, чтобы отключить все ваши подключения к базе данных MySQL:
lapply(dbListConnections(MySQL()), dbDisconnect)
(Обратите внимание, что вы можете заменить MySQL() другим драйвером DBI, если используете другую систему управления базами данных).
Затем вам нужно четко указать, как правильно отключиться. Эта часть зависит от варианта использования. Если вы начинаете соединение каждый раз, когда вы начинаете блестяще, вы можете добавить внутри server.ui
:
session$onSessionEnded(function(){
dbDisconnect(con)
}
Где ваша связь. Если вы запускаете соединение при каждом запуске запроса, вы должны отключиться сразу же после выполнения запроса.
Вы также должны взглянуть на пакет pool
, который предложил блестящей команде для управления соединениями.
Существует также очень полезный раздел Shiny Articles в базе данных.