Configuration

连接池是根据 Java 运行时配置和维护的。连接不会在不同的运行时之间共享。要使用连接池,不需要进行配置。仅当您要自定义池的完成方式(例如控制池的大小以及池的连接类型)时,才需要进行配置。

您可以在程序启动时使用许多系统属性来配置连接池。请注意,这些是系统属性,而不是环境属性,它们会影响所有连接池请求。

这是一个命令行示例,该命令将最大池大小设置为 20,将首选池大小设置为 10,并将空闲超时设置为 1 分钟(用于连接池)。

# java -Dcom.sun.jndi.ldap.connect.pool.maxsize=20 \
       -Dcom.sun.jndi.ldap.connect.pool.prefsize=10 \
       -Dcom.sun.jndi.ldap.connect.pool.timeout=60000 \
    UsePool

下表列出了用于配置连接池的系统属性。本节的其余部分将对它们进行更详细的描述。

系统属性名称DescriptionDefault
com\.sun\.jndi\.ldap\.connect\.pool\.authentication可以池化的连接的以空格分隔的身份验证类型的列表。有效类型为“无”,“简单”和“ DIGEST-MD5”。"none simple"
com\.sun\.jndi\.ldap\.connect\.pool\.debug一个字符串,指示要产生的调试输出的级别。有效值为"fine"(跟踪连接的创建和删除)和“所有”(所有调试信息)。
com\.sun\.jndi\.ldap\.connect\.pool\.initsize整数的字符串 表示形式,表示最初为该身份创建连接时要创建的每个连接身份的连接数。1
com\.sun\.jndi\.ldap\.connect\.pool\.maxsize整数的字符串 表示形式,它表示可以同时维护的每个连接标识的最大连接数。没有最大尺寸
com\.sun\.jndi\.ldap\.connect\.pool\.prefsize整数的字符串 表示形式,它表示每个连接标识应同时维护的首选连接数。没有首选的大小
com\.sun\.jndi\.ldap\.connect\.pool\.protocol可以合并的连接的以空格分隔的协议类型的列表。有效类型为“普通”和“ ssl”。"plain"
com\.sun\.jndi\.ldap\.connect\.pool\.timeout整数的字符串 表示形式,它表示空闲连接可以保持在池中而不被关闭或从池中删除的毫秒数。no timeout

汇集了什么

当您通过使用"com.sun.jndi.ldap.connect.pool"环境属性来请求Context实例使用连接池时,使用或未使用的连接可能会被池化。默认规则是允许合并使用简单或不使用身份验证的普通(非 SSL)连接。您可以使用系统属性来更改此默认值,以包括 SSL 连接和 DIGEST-MD5 身份验证类型。要允许普通和 SSL 连接都被池化,请将"com\.sun\.jndi\.ldap\.connect\.pool\.protocol"系统属性设置为字符串"plain ssl"。要允许匿名(无),简单和 DIGEST-MD5 身份验证类型的连接被合并,请将com\.sun\.jndi\.ldap\.connect\.pool\.authentication系统属性设置为字符串"none simple DIGEST\-MD5"

有几个环境属性会自动使Context实例不符合使用池化连接的资格。如果Context实例的"java\.naming\.ldap\.factory\.socket"属性设置为自定义套接字工厂类,或者其"java\.naming\.security\.sasl\.callback"属性设置为自定义回调处理程序类,或者其"com\.sun\.jndi\.ldap\.trace\.ber"属性设置为启用协议跟踪,则不能使用池化连接。

如何合并连接

Context实例请求使用池化连接时,LDAP 提供程序需要确定现有池化连接是否可以满足该请求。它通过为每个池连接分配一个连接标识并检查传入请求是否具有与其池连接之一相同的连接标识来做到这一点。

连接标识是创建可能已通过身份验证的 LDAP 连接所需的参数集。其组成取决于请求的身份验证类型,如下表所示。

Authentication Type连接标识内容
noneconnection controls

主机名,在"java\.naming\.provider\.url"属性中指定的端口号,引用或提供给初始上下文的 URL
以下属性的内容:
java.naming.security.protocol
java.naming.ldap.version
简单列出的所有信息都没有
以下属性的内容:
java.naming.security.principal
java.naming.security.credentials
DIGEST-MD5列出的所有信息都非常简单
以下属性的内容:
java.naming.security.sasl.authorizationId
java.naming.security.sasl.realm
javax.security.sasl.qop
javax.security.sasl.strength
javax.security.sasl.server.authentication
javax.security.sasl.maxbuffer
javax.security.sasl.policy.noplaintext
javax.security.sasl.policy.noactive
javax.security.sasl.policy.nodictionary
javax.security.sasl.policy.noanonymous
javax.security.sasl.policy.forward
javax.security.sasl.policy.credentials

Pool Sizes

LDAP 提供程序维护连接池。每个池包含具有相同连接标识的连接(使用中或空闲)。有三种大小会影响每个池的 管理。这些大小是全局大小,会影响所有池。

“初始池大小”是 LDAP 服务提供商在首次创建池时创建的每个连接标识的连接数(与应用程序首次请求该连接标识的池连接时相对应)。随着连接的使用,将按需执行池中每个连接的身份验证。默认情况下,初始池大小为 1,可以使用系统属性"com\.sun\.jndi\.ldap\.connect\.pool\.initsize"进行更改。它通常在应用程序启动时用于通过与服务器的一定数量的连接来启动池。

“最大池大小”是 LDAP 服务提供商可以同时维护的每个连接标识的最大连接数。使用中的和空闲的连接均会影响此数字。当池大小达到此数字时,在删除池中的连接(即关闭物理连接)之前,无法为相应的连接标识创建新的连接。当池的大小达到最大值并且池中的所有连接都在使用中时,应用程序对该池的连接请求将被阻止,直到池中的连接变为空闲或被删除为止。最大池大小为 0 表示没有最大大小:池连接的请求将使用现有的池空闲连接或新创建的池连接。

“首选池大小”是 LDAP 服务提供商应维护的每个连接标识的首选连接数。使用中的和空闲的连接均会影响此数字。当应用程序请求使用池化连接且池大小小于首选大小时,LDAP 提供程序将创建并使用新的池化连接,而不管是否有空闲连接可用。当应用程序完成池化连接(通过在共享该连接的所有上下文上调用Context\.close\(\))并且池大小大于首选大小时,LDAP 提供程序将关闭并从池中删除池化连接。首选池大小为 0 表示没有首选大小:仅当没有空闲连接可用时,对池连接的请求才会导致新创建的连接。

请注意,最大池大小会覆盖初始池大小和首选池大小。例如,将首选池大小设置为大于最大池大小,可以有效地将其设置为最大池大小。

Idle Connections

当应用程序完成池化连接时(通过在共享该连接的所有上下文上调用Context\.close\(\)),基础池化连接被标记为空闲,await 重用。默认情况下,空闲连接将无限期保留在池中,直到被垃圾回收为止。如果设置了"com\.sun\.jndi\.ldap\.connect\.pool\.timeout"系统属性,则 LDAP 提供程序将自动关闭并删除空闲时间超过指定时间的池化连接。