我有这样的代码:
List<String> dns = ...
List<Entry> entries = new ArrayList<>()
for(dn: dns)
entries.add(connection.getEntry())
我不喜欢这段代码,因为它进行了 n 次 ldap 调用。
有没有办法重写它以进行单个 Ldap 调用?
选项A:如果LDAP服务器支持特殊的“可分辨名称”属性,您可以构造一个匹配多个DN的OR过滤器。例如,Active Directory 支持
distinguishedName
,而 OpenLDAP 和 389ds 支持 entryDN
,因此如果您的服务器是 AD,那么您应该能够编写 (|(distinguishedName=FOO)(distinguishedName=BAR)(distinguishedName=BAZ))
。
(在过滤器中使用 DN 之前不要忘记转义它们 - 似乎您可以使用
Filter.or(Filter.equals(...), Filter.equals(...), ...)
让 UnboundId 生成有效的过滤器。)
不幸的是,这个属性是非标准的。
选项 B:异步发出多个调用。 LDAP 支持动态执行多个操作,因此您可以通过调用
asyncSearch()
提交一批约 50 个搜索操作,然后收集结果。
我认为,您可以提交的待处理操作的确切数量将根据 TCP 窗口大小而有所不同,但 50 应该是一个安全限制,并且仍然是一个显着的性能改进(尤其是在高延迟连接上)。