Použitím více připojení ODBC přes paralelizován pracovních vláken může dojít k selhání jako v následujícím příkladu:
loaddata <- function(cn){
result <- sqlQuery(cn,'select * from boston')
return(head(result))
}
library(RODBC)
cn1 <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
cn2 <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
cn3 <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
cn4 <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
rxSetComputeContext('localpar')
system.time ({
z <- rxExec(loaddata, rxElemArg(list(cn1,cn2,cn3,cn4)),
packagesToLoad='RODBC')
})
Error in do.call(.rxDoParFUN, as.list(args)) :
task 1 failed - "first argument is not an open RODBC channel"
Problém je, že pracovní procesy přijímání připojení ODBC jako uzavřené.
Zde problém je, že připojení jsou specifické pro proces, takže pokud zaměstnanci sdílejí nadřazeného procesu (například pomocí větvení vícejádrových pracovníků), pracovníci nelze sdílet připojení nadřazené. Chcete-li distribuovat ODBC výpočty-forked pracovníků, navázání připojení na každého zaměstnance jako součást distribuovaných úloh.
Příklad:
loaddata <- function(){library(RODBC)
cn <- odbcConnect("RevoTestDB", uid='RevoTester', pwd='RevoTester')
result <- sqlQuery(cn,'select * from boston')
return(head(result))
}
z <- system.time({z <- rxExec(loaddata,
packagesToLoad='RODBC')})