java - LdapTemplate 是否每次都关闭连接?

标签 java active-directory spring-ldap active-directory-group

我有一个使用 Spring LDAP 1.3.1 的应用程序。它正在创建 LdapTemplate在启动时的 Spring 上下文中,将其传递给我的应用程序。我连接到的 LDAP 字符串实际上是一个 VIP 设备,其背后有多个 Active Directory 服务器。

该应用程序用于创建组层次结构,并分几步完成。首先,它创建任何新组,然后删除任何已删除的组,然后更新和更改组,最后更新任何新组或移动组的父组。

在最后一步中,为了进行移动,我必须查找该组,然后查找它的父级,最后更新父级的成员列表以删除子级。

这就是问题的开始。每隔一段时间,但不是每次,我都有一个添加组的运行,但是当代码试图设置父级时,它失败了,因为新组还不存在。我相信正在发生的事情是 Spring LDAP 在每次调用时重新连接,并且因为我正在通过 VIP 并且 AD 服务器是循环的,我认为新添加的组没有复制,所以选择组返回null 并且我的父级更新失败。基本上我认为我遇到了 AD 复制的竞争条件。

所以,长解释短:Spring LDAP 1.3.1,特别是 LdapTemplate,是否每次都创建一个新连接,或者我误解了它是如何工作的?有没有办法通过配置 LdapTemaplate 或设置 com.sun.jndi.ldap.connect.pool 使其使用池连接?如果我在整个应用程序运行中只使用一个连接,它应该可以解决复制(如果发生这种情况)问题,因为我会被困在一台 AD 服务器上而不会来回跳动。

最佳答案

对于所有可能偶然发现这篇文章的 future 开发者,这就是我解决问题的方式......

在 Spring LDAP 1.3.2 中,SingleContextSource没有采用 ContextSource 的构造函数,而是只有一个需要 DirContext .我没有看到任何方法可以从我的 LdapContextSource 中获取单个 DirContext , 所以我无法使用 ig0774 的建议.

然而,在阅读了 Oracle 文档后,我发现它从 1.4.1 开始就内置了一个非常简单的 pooling mechanism .进一步阅读 LdapContextSource 的 Spring API 文档表明它能够通过调用 setPooled(boolean) 来打开此池机制。 .这基本上使得对连接的 close() 的调用不会真正关闭连接,而是将其返回到“池”。由于我的应用程序是一个大的线性线程,并且在给定时间只打开一个“连接”,这具有导致它简单地使用相同连接的净效果,从而绕过了我看到的问题是我的更新工作得更快比复制。打开内置池后,我的错误似乎停止了。

请注意,这不是为 LDAP 实现池化方案的好方法。正如 JavaDoc 所说,这种内置的池化机制有很多缺陷。如果你需要池,那么你最好使用 Spring LDAP 的 PoolingContextSource .然而,就我而言,我想要一个与“池”相反的东西,所以在这方面似乎对我来说是可行的。

另一种选择是不使用 VIP,而是直接连接到单个 Active Directory 服务器,但我失去了故障转移能力。

关于java - LdapTemplate 是否每次都关闭连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21559482/

相关文章:

java - 使用 DatastoreService 的查询字符串

java - 设置ImageView图片结果报错

java - 如何使用所有依赖项从命令行编译 Maven 项目?

php - LDAP 更改密码 PHP

在传输之前Java解码编码的LDAP过滤器?防止 LDAP 注入(inject)

Java KeyListener 停止工作

Azure AAD - 受众无效

java - Spring 注释 @Entry.base 不支持 SpEL

spring - 使用 Spring LdapTemplate 从 Active Directory 获取所有属性

c# - 使用 Forefront Identity Manager 进行自助式密码重置有哪些选项?