web-dev-qa-db-fra.com

Impossible d'allouer une nouvelle connexion: 16 connexions déjà ouvertes RMySQL

Je suis très nouveau sur brillant et R, mais en utilisant brillant, j'essaie de me connecter à une base de données pour récupérer les données à partir de là. Quand j'essaye d'accéder au travail de mon RShiny sur le navigateur continuellement j'ai une erreur comme Cannot allocate a new connection: 16 connections already opened. Comment puis-je surmonter cette erreur ou Rshine n'attend que 16 utilisateurs à la fois?. J'ai un autre poste de pile ici RStudio Shiny Error mysqlNewConnection maxinum de 16 connexions mais l'explanaation n'était pas claire sur l'URL ci-dessus. 

16
anoop

Peut-être que vous ouvrez une nouvelle connexion à la base de données avec obj <- dbConnect(...) chaque fois que vous envoyez une requête dans votre code. Vous pouvez simplement appeler dbDisconnect(obj) sur l'objet que vous avez créé pour supprimer la connexion respective à chaque fois que votre requête est exécutée.

Aussi, vous pouvez utiliser cette fonction tuer toutes les connexions ouvertes à la fois:

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

}

J'avais recommandé d'écrire une petite fonction en dehors de Shiny qui gère tout le processus d'ouverture et de fermeture:

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)
}

J'espère que cela pourra aider!

39
ThankGoat

Solution rapide

Si vous rencontrez ce problème, vous devez d'abord exécuter le code suivant de manière interactive pour déconnecter toutes vos connexions à la base de données MySQL:

lapply(dbListConnections(MySQL()), dbDisconnect)

(Notez que vous pouvez remplacer MySQL () par un autre pilote DBI, si vous utilisez un autre système de gestion de base de données).

Solution plus rapide

Il suffit de redémarrer la session R: command/ctrl + shift + F10 sur RStudio

Comment éviter ce problème

Vous devez indiquer à Shiny comment se déconnecter correctement. Cette partie dépend du cas d'utilisation. Si vous établissez une connexion chaque fois que vous démarrez brillant, vous pouvez ajouter dans server.ui

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

Où con est votre connexion . Si vous démarrez une connexion à chaque fois que vous exécutez une requête, vous devez vous déconnecter immédiatement après son exécution.

Vous devriez également jeter un coup d'œil au paquet pool qui est suggéré par l'équipe brillante de gestion des connexions . Il existe également une section très utile sur (articles brillants } dans la base de données.

5
Kevin Zarca

dbDisconnect () ne fonctionnait pas dans mon cas. J'avais donc arrêté le serveur MySQL depuis le terminal et commencé à nouveau à utiliser

Sudo service mysql stop

Sudo service mysql start

Ensuite, j'ai exécuté le code en utilisant dbDisconnect () et cela fonctionne maintenant pour moi.

1
Dipanwita Das