Ich teste ein neues Datenbanksystem mit einem bereitgestellten ODBC-Treiber und dem RODBC
-Paket.RODBC-Verbindung wird ungültig
Die Frage, die mir begegnet ist, ist, dass bereits nach wenigen Abfragen (alle innerhalb der Spanne von 2 bis 3 Minuten oder weniger), die Verbindung wird nicht mehr als gültig von R.
spezifisch erkannt, es ist nur eine einzige C
Funktion in der RODBC
Paket, RODBCcheckchannel
die sich beschweren. Es wird indirekt durch sqlQuery()
Die erste Zeile der RODBC::sqlQuery
Anrufe
if (!odbcValidChannel(channel))
stop("first argument is not an open RODBC channel")
odbcValidChannel
prüft drei Eigenschaften von channel
genannt.
Ich kann bestätigen, dass die beiden Überprüfungen in R
TRUE
zurückgegeben werden.
Es ist die letzte Prüfung, .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id"))
die für RODBCcheckchannel
FALSE
Quellcode zurückgibt, ist wie folgt
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));
}
ich R -d valgrind
versucht haben, verwenden, aber da der C
Code nicht Absturz ist per se, Das war nicht hilfreich.
Kann jemand etwas Licht, warum .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id"))
kehrt TRUE
für kurze vergießen, während dann FALSE
zurückkehrt?
Hat es etwas mit dem Griff zu tun?
(Apologies für den Mangel an reproduzierbaren exmample, denn das würde den Zugang zu einem sehr spezifischen Datenbanksystem erforderlich)
Vermutung: vielleicht schließt die DB die Verbindung? –
Einfach - hier gibt es nicht genug Informationen. ODBC verfügt über eine Ablaufverfolgung/Protokollierung - Sie sollten dies aktivieren, versuchen, den Fehler neu zu erstellen, und sehen, was Sie finden. Das fehlt ... Minimale Probleme bei der Fehlersuche erfordern normalerweise den Namen und die Version des jeweiligen DBMS und des Treibers, manchmal auch des Host-Betriebssystems auf beiden Seiten und verschiedene andere Details, die wir hier nicht haben . – TallTed
Die einzige Sache, die ich anbieten kann, ist, dass ich Remote-DBs erlebt habe, die Verbindungen nach einer Zeitperiode schließen, aber ich habe gesehen (mit Oracle), RODBC und ROracle zu benutzen, und es ist immer die entfernte DB, die es macht. – joran