从 LDAP 查询时由于搜索结果较大而导致内存泄漏
本文关键字:泄漏 内存 搜索结果 查询 LDAP | 更新日期: 2023-09-27 18:35:15
我正在使用数据表将用户详细信息从 Ldap 获取到数据库。
执行以下代码时处理器内存不断增加,最后我收到"内存异常错误"。
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domainName, userName, passwd, AuthenticationTypes.Secure);
DirectorySearcher dSearch = new DirectorySearcher(entry);
dSearch.PageSize = 1000;
dSearch.Filter = "(objectClass=*)";
dSearch.SearchScope = SearchScope.Subtree;
SearchResultCollection src = dSearch.FindAll();
int i = 0;
DataTable dt = new DataTable();
dt.Columns.Add("mail");
foreach (SearchResult sResultSet in src)
{
DataRow dr = dt.NewRow();
if (GetProperty(sResultSet, "mail") != "")
{
dr["mail"] = GetProperty(sResultSet, "mail").ToString();
}
dt.Rows.Add(dr);
i++;
if (i == 1000)
{
BulkInsertDataTable("TestTable", dt, 2);
dt.Dispose();
dt = new DataTable();
dt.Columns.Add("mail");
i = 0;
}
}
任何人都可以告诉我如何在每次批量插入数据库后释放内存?
提前谢谢。
您的
代码仅在索引 1000 处释放一次数据表。 将行从
if (i == 1000)
自
if ((i % 1000) == 0)
// you should also call BulkInsertDataTable("TestTable", dt, 2); after the foreach loop to insert the last set of data as well
public bool BulkInsertDataTable(string tableName, DataTable dataTable, int Mode)
{
bool isSuccuss = false;
try
{
if (Mode == 2)
{
SqlConnectionObj.Open();
SqlBulkCopy bulkCopy = new SqlBulkCopy(SqlConnectionObj, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.UseInternalTransaction, null);
bulkCopy.DestinationTableName = tableName;
bulkCopy.WriteToServer(dataTable);
SqlConnectionObj.Close();
isSuccuss = true;
}
}
catch (Exception ex)
{
isSuccuss = false;
throw ex;
}
return isSuccuss;
}