Sto testando un nuovo sistema di database utilizzando un driver ODBC fornito e il pacchetto RODBC
.Connessione RODBC non valida
Il problema che sto incontrando è che dopo solo un paio di domande (tutte nel giro di 2 ~ 3 minuti o meno), la connessione non viene più riconosciuto valido da R.
In particolare, è solo una singola funzione C
nel pacchetto RODBC
, RODBCcheckchannel
che si lamenta. Si chiama indirettamente da sqlQuery()
La prima linea di RODBC::sqlQuery
chiamate
if (!odbcValidChannel(channel))
stop("first argument is not an open RODBC channel")
odbcValidChannel
assegni tre proprietà di channel
.
Posso confermare che i due controlli effettuati in R
restituiscono TRUE
.
E 'l'ultimo controllo, .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id"))
che restituisce il codice FALSE
sorgente per RODBCcheckchannel
è la seguente
SEXP RODBCcheckchannel(SEXP chan, SEXP id)
{
SEXP ptr = getAttrib(chan, install("handle_ptr"));
pRODBCHandle thisHandle = R_ExternalPtrAddr(ptr);
return ScalarLogical(thisHandle && TYPEOF(ptr) == EXTPTRSXP &&
thisHandle->channel == asInteger(chan) &&
thisHandle->id == asInteger(id));
}
Ho provato con R -d valgrind
, ma dal momento che il codice C
non è crash per-sé, questo non è stato utile.
Qualcuno può far luce sul motivo per cui i rendimenti .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id"))
TRUE
per un breve periodo poi torna FALSE
?
Ha qualcosa a che fare con la maniglia?
(Ci scusiamo per la mancanza di exmample riproducibili, come quello richiederebbe l'accesso a un sistema di database molto specifico)
Indovinare: forse il DB sta chiudendo la connessione? –
Semplicemente - non ci sono abbastanza informazioni qui. ODBC ha una funzione di tracciabilità/registrazione: è necessario abilitarlo, provare a ricreare l'errore e vedere cosa trovi. Mancanza che ... In minima parte, la risoluzione dei problemi come questo richiede solitamente conoscere il nome e la versione di DBMS e Driver in questione, a volte il sistema operativo host su entrambi i lati e vari altri dettagli ... che non abbiamo qui . – TallTed
L'unica cosa che posso offrire è che ho sperimentato database remoti che chiudono le connessioni dopo un certo periodo di tempo, ma l'ho visto (con Oracle) usando RODBC e ROracle, ed è sempre il DB remoto a farlo. – joran