本教程适用于JDK 8。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言变更,了解Java SE 9及其后续版本中更新的语言功能摘要。
请参阅JDK版本说明,了解所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
连接池是按照Java运行时配置和维护的。连接不能在不同的运行时之间共享。要使用连接池,不需要配置。只有在想要自定义池化方式时,如控制池的大小和池化的连接类型时,才需要进行配置。
您可以在程序启动时使用一些系统属性来配置连接池。请注意,这些是系统属性,而不是环境属性,并且它们影响所有连接池请求。
下面是一个将最大池大小设置为20、首选池大小设置为10、空闲超时设置为一分钟的池化连接的命令行示例。
# 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
以下表格列出了配置连接池的系统属性。在本节的其余部分中将对它们进行详细描述。
系统属性名称 | 描述 | 默认值 |
---|---|---|
com.sun.jndi.ldap.connect.pool.authentication | 可以池化的连接的认证类型列表,以空格分隔。有效类型为"none"、"simple"和"DIGEST-MD5"。 | "none simple" |
com.sun.jndi.ldap.connect.pool.debug | 指示产生的调试输出级别的字符串。有效值为"fine"(跟踪连接的创建和移除)和"all"(所有调试信息)。 | |
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 | 可以池化的连接的协议类型列表,以空格分隔。有效类型为"plain"和"ssl"。 | "plain" |
com.sun.jndi.ldap.connect.pool.timeout | 表示空闲连接在不被关闭和从池中移除之前可以保持的毫秒数的整数的字符串表示。 | 无超时 |
当您请求一个Context
实例使用连接池时,使用"com.sun.jndi.ldap.connect.pool"
环境属性,所使用的连接可能是池化的也可能不是池化的。默认规则是允许非SSL连接以及使用简单或无身份验证的连接被池化。您可以通过使用系统属性来更改此默认设置,以包括SSL连接和DIGEST-MD5身份验证类型。要允许同时池化纯文本和SSL连接,请将"com.sun.jndi.ldap.connect.pool.protocol"系统属性设置为字符串"plain ssl"。要允许池化匿名(none)、简单和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连接所需的参数集合。其组成取决于请求的身份验证类型,如下表所示。
身份验证类型 | 连接标识内容 |
---|---|
none |
|
simple |
|
DIGEST-MD5 |
|
LDAP提供程序维护连接池,每个池都保存具有相同连接标识的连接(无论是使用中还是闲置)。有三个大小会影响每个池的管理。这些大小是全局的,影响所有池。
初始池大小是LDAP服务提供程序在首次创建池时为每个连接标识创建的连接数(对应于应用程序首次请求该连接标识的池连接时)。池中每个连接的身份验证是按需执行的,即在使用连接时进行。默认情况下,初始池大小为1,可以使用系统属性"com.sun.jndi.ldap.connect.pool.initsize"进行更改。通常在应用程序启动时使用,以将一定数量的连接预先放入服务器池中。
最大池大小是LDAP服务提供程序可以同时维护的每个连接标识的最大连接数。无论是使用中还是闲置的连接都会贡献到这个数字中。当池大小达到此数值时,不允许为相应的连接标识创建新连接,直到从池中删除一个连接(即关闭物理连接)。当池大小达到最大值并且池中的所有连接都在使用中时,应用程序对该池的连接请求将被阻塞,直到池中的某个连接变为空闲或被删除。最大池大小为0意味着没有最大大小:对池化连接的请求将使用现有的空闲连接或新创建的连接。
首选池大小是LDAP服务提供程序应该维护的每个连接标识的首选连接数。无论是使用中还是闲置的连接都会贡献到这个数字中。当应用程序请求使用池化连接且池大小小于首选大小时,LDAP提供程序将创建并使用新的池化连接,而不管是否有空闲连接可用。当应用程序完成对池化连接的使用(通过在共享连接的所有上下文上调用Context.close()),并且池大小大于首选大小时,LDAP提供程序将关闭并从池中删除池化连接。首选池大小为0意味着没有首选大小:对池化连接的请求仅在没有空闲连接可用时才会创建新连接。
请注意,最大池大小会覆盖初始池大小和首选池大小。例如,将首选池大小设置为大于最大池大小实际上是将其设置为最大池大小。
当应用程序完成对池化连接的使用(通过在共享连接的所有上下文上调用Context.close()),底层的池化连接被标记为闲置,等待重用。默认情况下,空闲连接将无限期地保留在池中,直到进行垃圾回收。如果设置了"com.sun.jndi.ldap.connect.pool.timeout"系统属性,则LDAP提供程序会自动关闭并删除已闲置超过指定时间的池化连接。