我正在使用spring-security-ldap-3.2.9,spring-ldap-core-1.3.2。
我们间歇性地遇到ldap挂断,该过程耗时超过2分钟。没有spring框架的实施没有问题。
这是我所缺少的已知问题还是某些配置?
答案 0 :(得分:1)
这听起来像是连接池的问题。假设您的服务具有使用持久连接的专用主体(例如,用于用户查找),则它可能正在尝试对陈旧的连接执行查询。如果未将池配置为例行验证那些连接,则它可能仅依靠超时来确定需要重新建立连接。
Spring LDAP支持Apache Commons Pool,该池具有内置的连接验证和维护配置选项(请参阅参考文档中的section 9.1)。在池化的ContextSource上启用testOnBorrow
和testWhileIdle
选项倾向于以最小的配置很好地驱逐过时的连接。如果您使用的是池化,那么请尽可能考虑将其更新到spring ldap 2.1+,从而引入support for Apache Commons Pool 2。
LDAP服务器还将具有其自己的超时设置,在该设置中,它会在一定的空闲持续时间后放弃其连接的结束。服务创建的任何连接的空闲超时都应小于LDAP服务器端的空闲超时。这将在LDAP服务器超时之前抢先丢弃空闲连接,从而在各自的主体下次需要与LDAP服务器通信时强制建立新连接。
答案 1 :(得分:1)
我真的找不到背后的原因,因为这是在框架内发生的,我无法编辑任何代码。
最后,我将实现切换回使用Java而不是spring的普通LDAP实现,并且到目前为止效果很好。
答案 2 :(得分:0)
我几乎完全遇到了这个问题。解决方案是从LdapContextSource中删除引用跟随。答案的末尾显示了固定的XML配置。
在VisualVM中观看代码的大部分执行时间都花费在AbstractLdapNamingEnumeration.hasMore()中。这导致我进入NamingEnumeration hasMoreElements method takes a lot of time when returning false for LDAP,并且我意识到它正在尝试遵循引荐,但我并不需要。关闭它摆脱了暂停。
<bean id="ldapContextSource"
class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="$ad{ldap.protocol}://$ad{ldap.server}:$ad{ldap.port}" />
<property name="base" value="${ldap.base}" />
<property name="userDn" value="$ldap{user}" />
<property name="password" value="$ldap{password}"/>
<!-- <property name="referral" value="follow" /> -->
<property name="baseEnvironmentProperties">
<map>
<entry key="java.naming.ldap.attributes.binary">
<value>objectSid</value>
</entry>
</map>
</property>
</bean>