【发布时间】:2015-04-30 01:32:59
【问题描述】:
我有一个 PowerShell 脚本,它从本地 SQL Server Express 2014 数据库读取数据并将其写入 CSV 文件。它运行良好,但几乎耗尽了 SQL Server 的整个可用内存池,并且在脚本完成运行时不会释放它。即使调用 GC.Collect() 也不会释放内存;我必须重新启动 SQL Server 服务才能恢复它。
这是脚本的相关部分,我已经确定发生了泄漏:
try {
$sqlConn = New-Object -TypeName System.Data.SqlClient.SqlConnection($sqlConnString);
$sqlConn.Open();
$sqlCmd = New-Object -TypeName System.Data.SqlClient.SqlCommand;
$sqlCmd.Connection = $sqlConn;
$sqlCmd.CommandType = [System.Data.CommandType]::Text;
$sqlCmd.CommandText = "SELECT * FROM $exportReadings";
#Write contents to a CSV file
$line = New-Object -TypeName System.Text.StringBuilder;
$out = New-Object -TypeName System.IO.StreamWriter -ArgumentList $csvFile, $false;
$out.WriteLine("HEADER_ROW");
$reader = $sqlCmd.ExecuteReader();
$cols = $reader.VisibleFieldCount;
while ($reader.Read()) {
$line.Clear();
for ($i = 0; $i -lt $cols; $i++) {
$val = $reader.GetValue($i);
if ($val -like "*$delimiter*") {
$line.Append('"').Append($val).Append('"');
}
else {
$line.Append($val);
}
if ($i -ne ($cols - 1)) {
$line.Append($delimiter);
}
}
$out.WriteLine($line.ToString());
}
}
catch {
throw;
}
finally {
if ($reader) { $reader.Dispose(); }
if ($out) {
$out.Close();
$out.Dispose();
}
$sqlCmd.Dispose();
$sqlConn.Dispose();
}
如果我在运行脚本之前查询 SQL Server 上的内存使用情况(我正在使用 SELECT * FROM sys.dm_exec_query_resource_semaphores),我会得到大约 750K 的 `available_memory_kb)。之后,它大约是 150K,即使脚本已经终止。
我已尝试尽可能释放所有资源,但我一定遗漏了一些东西。有什么想法吗?
【问题讨论】:
标签: sql-server powershell ado.net