当前位置: 首页 > 知识库问答 >
问题:

LdapTemplate是否每次都关闭连接?

魏岳
2023-03-14

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

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

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

问题就从这里开始。偶尔,但不是每次,我都会在运行中添加组,但当代码尝试设置父级时,它会失败,因为新组还没有出现。我相信现在的情况是,Spring LDAP在每次调用时都会重新连接,因为我要通过一个VIP,而AD服务器是循环的,所以我认为新添加的组没有复制,所以选择该组会返回null,并且我的父更新失败。基本上,我认为我正在与广告复制竞争。

那么,长话短说:SpringLDAP 1.3.1,尤其是LdapTemplate,是否每次都会创建一个新的连接,还是我误解了它的工作原理?有没有办法让它使用池连接,可以通过配置LdapTemaplate,也可以通过设置com。太阳jndi。ldap。连接池?如果我在整个应用程序运行中只使用了一个连接,那么应该可以解决复制(如果这是正在发生的情况)问题,因为我将被困在一个AD服务器上,而不会四处跳转。

共有2个答案

鲍建业
2023-03-14

您可能是对的,因为LdapTemboard似乎确实会在每次操作后关闭连接。减轻问题的一种方法是切换Spring配置,以便您使用SingleContextSource作为提供给您的LdapTemboard的当前contextSource的包装器。根据您的配置,这可能如下所示:

<beans>
   <bean id="contextSource"
      class="org.springframework.ldap.core.support.LdapContextSource">
      <property name="url" value="ldap://localhost:389" />
      <property name="base" value="dc=fabrikam,dc=com" />
      <property name="userName" value="cn=superuser,dc=fabrikam,dc=com" />
      <property name="password" value="secret" />
   </bean>

   <bean id="contextSourceWrapper"
      class="org.springframework.ldap.core.support.SingleContextSource">
      <constructor-arg ref="contextSource" />
   </bean>

   <bean id="ldapTemplate"
      class="org.springframework.ldap.core.LdapTemplate">
      <constructor-arg ref="contextSourceWrapper" />
   </bean>
</beans>
汝飞
2023-03-14

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

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

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

请注意,这不是为LDAP实现池化方案的好方法。正如JavaDoc所说,这种内置的池化机制有许多缺陷。如果您需要池化,那么您最好使用Spring LDAP的PoolingContextSource。然而,在我的情况下,我想要“池”的反义词,所以在这方面事情似乎对我来说很顺利。

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

 类似资料:
  • 我们目前正在处理这个函数,它必须部分使用数据库,部分使用服务,而这些操作非常耗时。所以,一般来说,这里有一个事务性方法,其代码如下: 所以最大的问题是——我是否应该在A点关闭连接,然后从B点的连接池再次获取它,以便其他servlet可以在我与服务交互时使用该连接?我的猜测是应该的,但这会损害我的事务吗?

  • 问题内容: 我有一个使用简单套接字在两个系统之间传递某些字符的应用程序。我的Java应用程序作为服务器运行。我建立了良好的连接,甚至传递了一条消息。但是,发送完一条消息后,我的连接关闭。 从我可以看出来的好像是在关闭时,套接字本身正在关闭吗?!这很不好,因为我有多个要在同一连接上发送的消息。 我吃饱了吗?如何在Java中维护此连接? 问题答案: 是的,关闭任何作家/读者将关闭他们包装的所有其他作家

  • 我为PHP代码设置了一个Cron作业,使其每20分钟运行一次。但它每次都会杀死EC2T2Micro实例。以下是服务器日志。Pls帮助。 ip-172-31-42-52登录:[20332.164336]内存不足:杀死进程1241(java)得分174或牺牲子 [20332.192538]杀死进程1241(java)总计-VM:1473180KB,Anon-RSS:176012KB,文件-RSS:0K

  • 我正在执行多个ajax调用,我想在显示表单之前完成所有这些调用。如果有错误,我想停止处理,只显示遇到的第一个错误。我谷歌了很多文章,包括StackOverflow上的文章,这些文章展示了如何链接当时的语句。但是似乎我必须给每个语句都附加一个捕获,否则只捕获最后一个语句中的错误。在本例中,Lookup是一个返回promise的异步调用,ShowError处理错误: 假设至少有一个错误,是否有任何方法

  • 我需要生成加密安全、随机和唯一的字符串,每个字符串实际上都将用作访问令牌。为此,我计划使用Java的类。但是,我不确定SecureRandom是否保证唯一性。换句话说,SecureRandom在生成的每一次都会产生不同的值吗? 用值(即)创建实例似乎可以工作。但是,我不确定。此外,这个答案指出种子既不安全也不可移植。种子值符合我的目的吗? 如果你有其他建议,我也想听听。

  • 我读过很多帖子,人们说在java、语句等中关闭连接,但我没有找到我的问题的答案。 我问我不做Con.close(),但我做所以它会关闭连接或不? 所以我只想知道,当我们关闭结果集时,连接是否会关闭?