池化支持
池化 LDAP 连接有助于减轻为每次 LDAP 交互创建新 LDAP 连接带来的开销。虽然 Java LDAP 池化支持 存在,但其配置选项和功能(如连接验证和池维护)有限。Spring LDAP 提供了对每个 ContextSource
的详细池配置的支持。
池化支持是通过在应用程序上下文配置中的 <ldap:context-source />
元素中提供一个 <ldap:pooling />
子元素来提供的。只读和读写 DirContext
对象分别进行池化(如果指定了 anonymous-read-only
)。Jakarta Commons-Pool 用于提供底层池实现。
DirContext
验证
池化连接的验证是使用自定义池库而不是 JDK 提供的 LDAP 池化功能的主要动机。验证允许在将池化 DirContext
连接从池中检出、检入池或在池中处于空闲状态时检查它们是否仍然正确连接和配置。
如果配置了连接验证,则通过使用 DefaultDirContextValidator
来验证池化连接。DefaultDirContextValidator
执行 DirContext.search(String, String, SearchControls)
,其中名称为空,过滤器为 "objectclass=*"
,并且 SearchControls
设置为仅限制一个结果,其中只有 objectclass
属性和 500 毫秒的超时。如果返回的 NamingEnumeration
包含结果,则 DirContext
通过验证。如果未返回任何结果或抛出异常,则 DirContext
验证失败。默认设置无需任何配置更改即可在大多数 LDAP 服务器上工作,并提供验证 DirContext
的最快方法。如果需要自定义,可以通过使用验证配置属性来实现,如 池配置 中所述。
如果连接抛出被认为是非瞬态的异常,则会自动将其失效。例如,如果 DirContext 实例抛出 javax.naming.CommunicationException ,则将其解释为非瞬态错误,并且该实例会自动失效,而无需额外 testOnReturn 操作的开销。被解释为非瞬态的异常是通过使用 PoolingContextSource 的 nonTransientExceptions 属性来配置的。 |
池配置
以下属性可在 <ldap:pooling />
元素上使用,用于配置 DirContext 池
属性 | 默认值 | 描述 |
---|---|---|
|
|
每种类型(只读或读写)的活动连接的最大数量,这些连接可以同时从该池分配。您可以使用非正数表示无限制。 |
|
|
可以同时从该池分配的所有类型活动连接的总最大数量。您可以使用非正数表示无限制。 |
|
|
每种类型(只读或读写)的活动连接的最大数量,这些连接可以保持空闲状态,而不会释放额外的连接。您可以使用非正数表示无限制。 |
|
|
每种类型(只读或读写)的活动连接的最小数量,这些连接可以保持空闲状态,而不会创建额外的连接。您可以使用零(默认值)来不创建任何连接。 |
|
|
池在(没有可用连接时)等待连接返回的最大毫秒数,然后再抛出异常。您可以使用非正数表示无限期等待。 |
|
|
指定池耗尽时的行为。
|
|
|
是否在从池中借用对象之前对其进行验证。如果对象验证失败,则将其从池中删除,并尝试借用另一个对象。 |
|
|
是否在将对象返回到池之前对其进行验证。 |
|
|
空闲对象逐出器(如果有)是否验证对象。如果对象验证失败,则将其从池中删除。 |
|
|
在空闲对象逐出器线程的每次运行之间休眠的毫秒数。当为非正数时,不会运行空闲对象逐出器线程。 |
|
|
在空闲对象逐出器线程(如果有)的每次运行期间检查的对象数量。 |
|
|
对象在池中保持空闲状态的最小时间量,之后才能由空闲对象逐出器(如果有)进行逐出。 |
|
|
验证连接时使用的搜索基础。仅当指定了 |
|
|
验证连接时使用的搜索过滤器。仅当指定了 |
|
|
验证连接时要使用的 |
|
|
|
Pool2 配置
以下属性可在<ldap:pooling2 />
元素上使用,用于配置DirContext
池
属性 | 默认值 | 描述 |
---|---|---|
|
|
可以同时从该池分配的所有类型活动连接的总最大数量。您可以使用非正数表示无限制。 |
|
|
每个键由池分配的对象实例数(已检出或空闲)的限制。当达到限制时,子池将耗尽。负值表示没有限制。 |
|
|
每种类型(只读或读写)的活动连接的最大数量,这些连接可以保持空闲状态,而无需释放额外的连接。负值表示没有限制。 |
|
|
每种类型(只读或读写)的活动连接的最小数量,这些连接可以保持空闲状态,而无需创建额外的连接。您可以使用零(默认值)来不创建任何连接。 |
|
|
池在(没有可用连接时)等待连接返回的最大毫秒数,然后再抛出异常。您可以使用非正数无限期等待。 |
|
|
是否等到有新的对象可用。如果max-wait为正,则如果在 |
|
|
在借用之前是否验证对象。如果对象验证失败,则借用失败。 |
|
|
对象在从池中借用之前是否被验证的指示器。如果对象验证失败,则将其从池中删除,并尝试借用另一个对象。 |
|
|
对象在返回到池之前是否被验证的指示器。 |
|
|
对象是否由空闲对象逐出器(如果有)验证的指示器。如果对象验证失败,则将其从池中删除。 |
|
|
在空闲对象逐出器线程的每次运行之间休眠的毫秒数。当为非正数时,不会运行空闲对象逐出器线程。 |
|
|
在空闲对象逐出器线程(如果有)的每次运行期间检查的对象数量。 |
|
|
对象在池中保持空闲状态的最小时间量,之后才能由空闲对象逐出器(如果有)进行逐出。 |
|
|
对象在池中空闲的最短时间,在此时间之后它才有资格被空闲对象逐出器逐出,并附带一个额外条件,即每个键至少有最少数量的对象实例保留在池中。如果将其设置为正值,则此设置将被 |
|
|
此池使用的逐出策略实现。池尝试使用线程上下文类加载器加载类。如果失败,池尝试使用加载此类的类加载器加载类。 |
|
|
池公平地为等待借用连接的线程提供服务。 |
|
|
使用平台MBean服务器为池启用JMX。 |
|
|
用作分配给JMX启用的池的名称的一部分的JMX名称基础。 |
|
|
用作分配给JMX启用的池的名称的一部分的JMX名称前缀。 |
|
|
指示池在空闲对象方面是否具有后进先出(LIFO)行为,或者作为先入先出(FIFO)队列。LIFO始终从池中返回最近使用的对象,而FIFO始终返回空闲对象池中最旧的对象 |
|
|
用于验证搜索的基础DN。 |
|
|
用于验证查询的过滤器。 |
|
|
验证连接时要使用的 |
|
|
|
配置
配置池需要添加一个嵌套在<ldap:context-source>
元素中的<ldap:pooling>
元素,如下所示
<beans>
...
<ldap:context-source
password="secret" url="ldap://127.0.0.1:389" username="cn=Manager">
<ldap:pooling />
</ldap:context-source>
...
</beans>
在实际情况中,您可能会配置池选项并启用连接验证。前面的示例演示了总体思路。
已知问题
本节描述了人们使用Spring LDAP时有时会出现的问题。目前,它涵盖以下问题
自定义身份验证
PoolingContextSource
假设从ContextSource.getReadOnlyContext()
检索到的所有DirContext
对象具有相同的环境,同样,从ContextSource.getReadWriteContext()
检索到的所有DirContext
对象也具有相同的环境。这意味着将配置了AuthenticationSource
的LdapContextSource
包装在PoolingContextSource
中不会按预期工作。池将使用第一个用户的凭据填充,并且,除非需要新连接,否则后续的上下文请求不会为请求线程的AuthenticationSource
指定的用户填充。