gpt4 book ai didi

java - 使用 LdapTemplate 时 LDAP 连接不会关闭

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:59 24 4
gpt4 key购买 nike

关闭 Tomcat 后,我​​们看到许多有关可能内存泄漏的错误,因为 Tomcat 未能停止线程。根据 Tomcat 的说法,我们有大约 2600 个守护线程正在 com.sun.jndi.ldap.Connection.pauseReader 中等待。

我们正在使用 LdapTemplate 从 LDAP 读取数据。每次我们需要从 LDAP 读取数据时都会创建 LdapTemplate。从文档中我看到搜索结束后所有资源都由LdapTemplate释放。我们尚未为 LdapTemplate 启用池化,默认值为 false。

调试后发现,为Connection创建的线程在搜索结束后并没有立即销毁,但最终还是有一些线程被销毁。

知道为什么我们会有这么多守护线程在 com.sun.jndi.ldap.Connection.pauseReader 上等待吗?

我们正在使用 spring-ldap 2.0.2.RELEASE。

有关我们如何在执行搜索之前创建 LdapTemplate 的示例代码:

LdapContextSource contextSource = new LdapContextSource();
SimpleAuthenticationSource authenticationSource = new SimpleAuthenticationSource(userDn, password);
contextSource.setAuthenticationSource(authenticationSource);
LdapTemplate ldapTemplate = new LdapTemplate(contextSource);
ldapTemplate.setIgnorePartialResultException(true);

更新: 设置池化为 true 后,连接就可以正常释放了。

ldapContextSource.setPooled(true); 

问题是我们无法使用池化。我仍然不明白为什么在不使用池时连接没有正确释放。

最佳答案

您提到您没有使用连接池,但这很可能解决您在失控线程中遇到的问题。

Take a look here如何使用 PoolingContextSource 通过 Spring XML 配置来配置 LDAP 连接池。 Here is another example了解如何使用基于注释的配置启用连接池。

请注意,文档特别提到要在 Spring LDAP 中启用池化,而不是通过“com.sun.jndi.ldap.connect.pool”属性在 JDK 中启用 JNDI LDAP 提供程序。

作为引用,这里有一个 2013 年的类似问题,启用连接池似乎能够减少线程数量:https://github.com/spring-projects/spring-security/issues/2397

关于java - 使用 LdapTemplate 时 LDAP 连接不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40706968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com