2015-07-20 15 views
5

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

odbcValidChannelprüft drei Eigenschaften von channel genannt.
Ich kann bestätigen, dass die beiden Überprüfungen in RTRUE zurückgegeben werden.
Es ist die letzte Prüfung, .Call(RODBC:::C_RODBCcheckchannel, channel, attr(channel, "id")) die für RODBCcheckchannelFALSE

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)

+0

Vermutung: vielleicht schließt die DB die Verbindung? –

+0

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

+1

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

Antwort

0

Können Sie den folgenden Code hinzufügen Tracing? Wenn ja, wäre es sinnvoll, die Werte für thisHandle, TYPEOF (ptr), thisHandle-> channel, thisHandle-> id auszudrucken, um zu sehen, was sich geändert hat?

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