none
使用System.DirectoryServices连接AD服务器的性能问题,是否支持连接池? RRS feed

  • 问题

  • 我的系统需要并发访问AD服务器读取用户信息。

    如果System.DirectoryServices支持类似数据库连接的Connection Pool就好了,

    这样似乎可以做到重用上一个LDAP连接的效果。

    可是我翻了S.DS的API,貌似连手动控制连接打开和关闭都没有。

    请教大家的看法。

    2014年10月22日 4:43

全部回复

  • 你好:

    建议你看一下这篇博客:

    System.DirectoryServices and connection pooling

    S.DS is also   imlementing connection pooling under some conditions. I was aware that S.DS   should use the same connection if:

        
    • connection        is being made within the same security context  
    • connection        is using the same authentication type.

    using(DirectoryEntry rootEntry = new DirectoryEntry(
                "LDAP://" + ldapHostName/rootDSE”,
                userName,
                userPwd,
                AuthenticationTypes.Secure))
                {
                    rootEntry.RefreshCache();
                    using (DirectoryEntry member = new DirectoryEntry())
                    {
                        member.Username = userName;
                        member.Password = userPwd;
                        member.AuthenticationType = AuthenticationTypes.Secure;  
    
                        foreach (string dn in dns)
                        {
                        member.Path = “LDAP://w2k.pl/” + dn;
                        Guid guid = new Guid((byte[])member.Properties[”objectGUID”].Value);
                        Console.WriteLine(guid.ToString(”B”));
                        }
                    }
                }
    我没有测试过,这段代码有点问题,你可以修改一下。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年10月23日 2:52
    版主
  • 
    

    Caillen Zhong, 感谢你的回复。

    这个blog我看见过,我也觉得这个代码很奇怪。

    莫非using里面不需要重新new DirectoryEntry,

    所有的member应该是rootEntry对象?

    不然无法理解作者的意图。

    不过这个所谓FCL自己控制的连接重用还是不适合并发访问,

    首先,它需要保证在一个上下文中,也就是说rootEntry需要保证不被回收。

    另外,如果rootEntry将rootEntry做成singleton或者static的话,多线程访问性能会更差。

    也就是说,这位作者的代码是能使用于单线程批量数据倒入功能吧。

    2014年10月24日 9:38
  • 多线程的情况下应该是这样的,我也不是太确定,查了一些文档,有些地方表明System.DirectoryServices默认情况下会在需要的时候使用连接池。但都是一带而过,没有确切的说明。也许通过这个类可以实现连接重用,创建自己的连接池:

    LdapConnection Class


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年11月3日 2:51
    版主