2015-08-21 12 views
11

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

+0

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

+0

Apri una connessione prima di 'shinyServer' e usa questa unica connessione per tutto il tempo. –

risposta

30

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!

+0

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

+0

È tutto nella documentazione del pacchetto RMySQL. Basta digitare '? RMySQL' nella console e iniziare a leggere;) – ThankGoat

+2

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

1

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.

1

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.

Problemi correlati