Могу ли я использовать только одно соединение RODBC в Foreach с помощью doParallel в R?

Я знаю, что могу открыть соединение SQL Server в каждом рабочем, однако он одновременно открывает несколько соединений с сервером. Администраторы базы данных моей работы говорят, что я использую слишком много системных ресурсов, открывая несколько соединений одновременно, и что мне нужно использовать только одно соединение. Можно ли открыть одно соединение и передать его каждому воркеру? Я прочитал ответ о том, почему это нельзя выполнить здесь: RODBC & foreach, но я надеялся может быть новое решение или новые идеи.

library(foreach)
library(doParallel)
cl <- makeCluster(detectCores() - 1)
clusterEvalQ(cl, {
    library(RODBC)
    Conn   <- odbcConnect("SERVER_NAME")
})

foreach(iter=1:10, .noexport="Conn") %dopar% {
    # Code block
}

Мне также это нужно, потому что я создаю временную таблицу и мне нужно, чтобы каждый рабочий мог получить доступ к соединению, имеющему временную таблицу. В противном случае каждый воркер открывает новое соединение и не имеет доступа к соединению с временной таблицей. Спасибо!


person James Marquez    schedule 03.01.2020    source источник


Ответы (1)


Вы не сможете работать одновременно через одно соединение, даже если сможете поделиться им.

Если вы хотите, чтобы несколько дочерних процессов, каждый со своим соединением, видели одни и те же данные, используйте либо постоянную таблицу, либо глобальную временную таблицу, созданную в процессе драйвера. например

create table ##foo(...)

Глобальные временные таблицы автоматически удаляются, когда завершается сеанс, создавший таблицу, и все остальные задачи перестают ссылаться на них. Связь между задачей и таблицей сохраняется только на время существования одной инструкции Transact-SQL. Это означает, что глобальная временная таблица удаляется при завершении последней инструкции Transact-SQL, которая активно ссылалась на таблицу при завершении сеанса создания.

СОЗДАТЬ ТАБЛИЦУ

person David Browne - Microsoft    schedule 04.01.2020