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