java LDAP VLV抛出错误“其他排序请求已在进行中”

f4t66c6m  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(101)

bounty将在2小时后过期。回答此问题可获得+200声望奖励。NG.希望吸引更多人关注此问题。

我正在尝试使用vlv在LDAP中实现分页,参考文档https://docs.ldap.com/ldap-sdk/docs/javadoc/com/unboundid/ldap/sdk/controls/VirtualListViewRequestControl.html
单线程运行正常,但当尝试同时运行多个线程(最多5个线程)时运行正常,但随着线程数量的增加,只有5个线程可以成功运行,超过了失败的线程,并显示以下错误消息:

LDAPException(resultCode=51 (busy), numEntries=0, numReferences=0, diagnostiMessage='Other sort requests already in progress', ldapSDKVersion=5.1.1..

我正在使用OpenLDAP,Unboundid API与Java连接。关于数据大小,它是100k左右。

  • 已尝试使用单个连接和多个连接(具有多个并发线程),但在两种情况下均出现相同的错误。
  • 尝试同步块以提取数据。
  • 出现异常时,让线程等待并重试。以上所有操作都不起作用,线程无法从LDAP中获取数据。在尝试关闭并重新连接https://www.openldap.org/lists/openldap-technical/201107/msg00006.html中所述的连接后,失败的线程可以获取数据,但在重试了很多次后,在我的情况下,线程重试了大约2k次,然后开始获取数据。

有没有更好的解决方案,重试2k次并获得结果不是一个好的选择。

gojuced7

gojuced71#

根据我在JAVA中的经验,最好使用thread pools,它将您的解决方案从“如何管理线程”转变为更健壮和面向任务的解决方案。

**(您的用例)要点:**您可能希望定义一个具有固定大小线程的线程池。该池将通过重用池中的线程来管理所有传入的负载。这非常有效,因为线程越多并不意味着性能越高。您可能希望使用重用线程的机制,而不是只打开和关闭线程并使用过多的线程。

您可以从类似以下内容开始:

ExecutorService executorService = Executors.newFixedThreadPool(10);

Future<SearchResult> task1 = executorService.submit(() -> {
  // your logic goes here
  return result;
});

SearchResult result = task1.get();

这是一段过于简化的代码,但您可以清楚地看到:

  • 可以从堆栈启动任务(动态)
  • 可以使用侦听器获取结果(仅在结果准备就绪时获取结果-无需轮询)
  • 线程池管理负载-因此您可以调整配置并提高性能,而无需更改代码(非常适合可能希望配置解决方案以适应其硬件配置文件的各种环境)

我觉得你应该给予一试。。毕竟--重试2000次才成功真的不是那种闲🙃

相关问题