我已成功使用以下代码在R中成功创建到TSQL服务器的并行连接:
SQL_retrieve <- function(x){
con <-
odbcDriverConnect(
'driver={SQL Server};server=OPTMSLMSOFT02;database=Ad_History;trusted_connection=true'
)
odbcGetInfo(con)
rawData <-
sqlQuery(con,
paste(
"select * from AD_MDL_R_INPUT a where a.itm_lctn_num = ",
facility[x]
))
odbcClose(con)
return(rawData)
}
cl <- makeCluster(5)
registerDoParallel(cl)
outputPar <- foreach(j = 1:facility_count, .packages="RODBC") %dopar% SQL_retrieve(j)
stopCluster(cl)
我希望所有连接都可以并行主动下载,但实际情况是,一次只有一个或两个连接处于活动状态(参见下图)。这与创建的集群/连接数无关。即使有32个连接,总下载时间也会略微超过1/2(理论上应该接近1/32,对吧?)。连接活动之间也有很大的暂停。为什么是这样?我在这里缺少什么?
要记住的一些注意事项:
更新7/26/17 再次尝试这个问题,它现在可以工作(代码不变)。不确定现在和初始发布之间发生了什么,但可能对MS SQL服务器设置进行了一些更改(不太可能)。
拉动790万行的时间遵循下图中的曲线。
答案 0 :(得分:0)
SQL Server使用&#34;连接池&#34;。通常,连接需要花费大量时间从头开始建立。此外,在实践中,应用程序将重复相同的连接,因此池化可提高性能。在某种程度上,SQL半关闭连接,因此下一个连接将从一个支持开始,并且发生得更快。
有时您可能不想使用池,这可能是其中之一。通过添加&#34; pooling = false来关闭池:&#39;如上所述 @ rene-lykke-dahl应该解决这个问题。
您可以在此处找到有关连接池的更多信息。
https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling