Не удается выделить новое соединение: 16 подключений уже открыты RMySQL

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

Ответ 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 в базе данных.