Sono molto nuovo a lucido e R ma utilizzando lucido sto provando a connettermi a un database per recuperare i dati da lì. Quando provo ad accedere al mio lavoro RShiny sul browser in modo continuo, ho ricevuto un errore come Cannot allocate a new connection: 16 connections already opened
. Come posso superare questo errore o Rshine mi aspetto solo 16 utenti alla volta ?. Ho ottenuto un altro post stack qui RStudio Shiny Error mysqlNewConnection maxinum of 16 connections ma la spiegazione non era chiara nell'url sopra.Impossibile allocare una nuova connessione: 16 connessioni già aperte RMySQL
risposta
Forse si apre una nuova connessione DB con obj <- dbConnect(...)
ogni volta che si invia una query nel codice. Puoi semplicemente chiamare dbDisconnect(obj)
sull'oggetto che hai creato per terminare la rispettiva connessione ogni volta che la query è stata eseguita.
Inoltre è possibile utilizzare questa funzione uccidere tutte le connessioni aperte in una sola volta:
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."))
}
avrei recommed di scrivere una piccola funzione di fuori lucido che gestisce l'intera apertura e chiusura cosa:
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)
}
Spero che questo aiuti!
Grazie a @ThankGoat. Questo è stato davvero utile e risolto il problema. Ma puoi spiegare da dove ho ricevuto la documentazione corretta per tutti questi. – anoop
È tutto nella documentazione del pacchetto RMySQL. Basta digitare '? RMySQL' nella console e iniziare a leggere;) – ThankGoat
Consiglio caldamente l'uso di' on.exit (dbDisconnect (DB)) 'subito dopo' DB <- dbConnect'.In caso contrario, gli errori di sintassi della query lasceranno la connessione aperta. – Marek
dbDisconnect() non funzionava nel mio caso. Così mi ero fermato server MySQL dal terminale e di nuovo iniziato a utilizzare
avviare il servizio sudo mysql fermata
servizio sudo mysql
Poi mi sono imbattuto il codice con l'utilizzo di dbDisconnect() ora il suo lavoro per me.
Se si ottiene questo problema, è necessario prima eseguire il seguente codice in modo interattivo di scollegare tutte le connessioni al database MySQL:
lapply(dbListConnections(MySQL()), dbDisconnect)
(Si noti che è possibile sostituire MySQL() da un altro driver DBI, se usi un altro sistema di gestione del database).
Quindi, è necessario esplicitare a lucido come disconnettere correttamente. Quella parte dipende dal caso d'uso. Se si avvia una connessione ogni volta che si avvia lucido, si potrebbe aggiungere all'interno server.ui
:
session$onSessionEnded(function(){
dbDisconnect(con)
}
Dove condizionata è il vostro legame. Se si avvia una connessione ogni volta che si esegue una query, è necessario disconnettersi immediatamente dopo l'esecuzione della query.
Si dovrebbe anche dare un'occhiata al pacchetto pool
che è suggested dal team lucido per gestire le connessioni. C'è anche una sezione molto utile su Shiny Articles sul database.
Hai * bisogno * di connessioni 16+ aperte contemporaneamente o stai cercando un modo per chiudere le connessioni inutilizzate? Se è il primo, [questo post del blog] (http://fransvandunne.com/2015/07/allow-for-more-than-16-rmysql-connections-in-r/) sembra fornire una soluzione. – nrussell
Apri una connessione prima di 'shinyServer' e usa questa unica connessione per tutto il tempo. –