优化.NET访问Active Directory的性能
从Active Directory获取大量对象时应特别注意,一不小心,就会掉入性能瓶颈甚至引起内存泄漏。本文提供了一个关于.NET访问Active Directory的优化例子。
1.获取对象的属性值 DirectoryEntry.Properties
获取一个DirectoryEntry对象后,我们就开始检索它的属性值;习惯了用foreach的朋友一般会这样写:
foreach(Property property in entry.Properties)
{
if(property.Name == //)
//
}
事实上,System.DirectoryService.PropertyCollection内部包含了一个HashTable用于键值对访问,并且在索引器中,对未包含的键,创建一个新的PropertyValueCollection对象并加入到HashTable中。
所以,我们可以放心地直接写下:
object value = entry.Properties[propertName].Value;
对这个新建的PropertyValueColletion,它的Value属性定义同样保证了访问的健壮性,这是它的源代码:
{
get
{
if (base.Count == 0)
{
return null;
}
if (base.Count == 1)
{
return base.List[0];
}
object[] array = new object[base.Count];
base.List.CopyTo(array, 0);
return array;
}
}
这样,代码中不需要去调用entry.Properties.Contains方法,而直接使用以下代码就可以高效地访问DirectoryEntry对象的属性了:
if ( value != null )
{
//
}
在测试中,查询两万个对象的属性值时,可以节省90秒左右的时间。
2.构建搜索器 DirectorySearcher
使用这个类应注意三点:
(1)对搜索结果的缓存。它默认的CacheResults为true,如果你不需要,应记得将它设置为false,否则一大块空间就浪费了。
(2)仅搜索已赋值的Property。PropertyNamesOnly默认为false,会搜索所有的Property返回多于你想要的对象,记得将它设置为true。
(3)可以在其构造函数中指定PropertyName数组,只搜索包含PropertyName的对象。
下面的例子是搜索包含UserName和Password属性并且属性已赋值的对象:
entry,
"username=*",
new string[] { "UserName", "Password", });
searcher.PropertyNamesOnly = true;
SearchResultCollection results = searcher.FindAll();
3.遍历和释放结果集 SearchResultCollection
foreach对于SearchResultCollection的访问是更高效的方式,这是因为,SearchResultCollection的内部使用ArrayList进行集合的索引访问,在第一次加载ArrayList时,它调用迭代器将所有的SearchResult对象创建并装箱到ArrayList中,当进行SearchResultCollection[int index]访问时,它对ArrayList中的对象进行拆箱操作。下面是SearchResultCollection构建InnerList的源代码:
{
get
{
if (this.innerList == null)
{
this.innerList = new ArrayList();
IEnumerator enumerator = new ResultsEnumerator(this, this.rootEntry.GetUsername(), this.rootEntry.GetPassword(), this.rootEntry.AuthenticationType);
while (enumerator.MoveNext())
{
this.innerList.Add(enumerator.Current);
}
}
return this.innerList;
}
}
而foreach是直接调用迭代器创建和返回一个SearchResult对象,避免了装箱与拆箱的过程。
应严重注意的是:SearchResultCollection是未托管资源,而且会占用大量的内存,需要获取大量对象的属性时,推荐使用集合来保存所需的属性值,完成之后立即调用SearchResultCollection.Dispose()来对它进行释放,否则,会导致内存泄露。
转载于:https://www.cnblogs.com/RCFans/archive/2008/11/18/1336290.html
优化.NET访问Active Directory的性能相关推荐
- 活动目录(Active Directory)
Active Directory和活动目录是同义词,已合并. 活动目录 百科名片 活动目录(Active Directory)是面向Windows Standard Server.Windows En ...
- 如何验证 Active Directory 使用表单身份验证和 Visual C#.NET
本文引用下面的 Microsoft.NET 框架类库名称空间: System.Text System.DirectoryServices System.Security.Principal Syste ...
- 创建使用 Active Directory 模式隔离用户的新 FTP 站点
"使用 Active Directory 隔离用户"模式根据相应的 Active Directory 容器验证用户凭据,而不是搜索整个 Active Directory,因为这样做 ...
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
转自:http://blog.csdn.net/lingpaoershiyishiji/article/details/9139527 目录 示例准备 知识了解 读取AD域信息示例 Directory ...
- php ldap目录协议,PHP 通过LDAP协议,操作Windows Active Directory
一.学习如何管理Active Directory Active Directory 循序渐进系列指南 二.ADExplorer 到网上下载一个ADExplorer,它是Active Directory ...
- 域渗透基础知识(二)之活动目录 Active Directory 的查询
目录 Active Directory Active Directory 的查询基础语法 什么是BaseDN 什么是Naming Context 什么是LDAP(轻量级目录访问协议) 过滤规则 LDA ...
- 查询性能优化(使用 Explain 进行分析、优化数据访问、重构查询方式)、存储引擎(InnoDB/MyISAM)
1.查询性能优化 1.1 使用 Explain 进行分析 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 比较重要的字段有: select ...
- Active Directory 域滲透 (如何访问数据库?)
数据库数据交互,域控制器提供了几个选项来转换为它们支持的各种协议/服务: LDAP 端口: LDAP 定义了一种查询语法,允许您过滤需要在数据库中检索/编辑的对象.您可以按对象的属性过滤对象.例如,要 ...
- 活动目录(Active Directory)域故障解决实例
A1.客户机无法加入到域? 一.权限问题. 要想把一台计算机加入到域,必须得以这台计算机上的本地管理员(默认为administrator)身份登录,保证对这台计算机有管理控制权限.普通用户登录进来,更 ...
最新文章
- JavaScript中的this用法
- 【数据库】MySQL数据库(一)
- 素质教育,是救命稻草,还是压垮教培机构的最后一根稻草
- 主业失利,跨界捞金,飞科的算盘能如意吗?
- LeetCode——Same Tree(判断两棵树是否相同)
- mac iTunes启动失败,声称iTunes文件夹被锁定
- 用python画六瓣雪花_python-turtle-画雪花-2种方法及效果的详解
- ROS入门笔记(六): ROS系统架构
- 中国移动也要办电竞大赛了!联合腾讯网易办首届电竞大赛
- AI 换脸冲上 GitHub TOP1,如何一键生成亲妈都不认识的自己?
- 使用cgroup限制某个程序对内存的使用
- 《机器学习实战》--资料下载和运行环境
- aspx 微型_最初的十亿分钟:正在向世界授课的微型非营利组织背后的数字
- 网络安全专栏——telnet远程登录数据包捕获个性化登录账号及密码(图文丰富 保姆级 有几种错误解决方案 为什么不用输入telnet密码就能登录 )
- ogg是什么文件?ogg怎么转mp3格式?
- Excel的一些实用函数(if函数,vlookup函数,match函数)
- 逆向分析系列——查壳侦壳工具
- Android返回上一页面的方式
- 面试官最常问的10道测试用例面试题及答案,每1题都很经典
- Ionic开发入门教程_3