好的,我正在将我的应用程序从非SSL连接到我的LDAP服务器的SSL连接。在非SSL中运行应用程序时,连接池工作正常。但是,当我切换到SSL时,连接池不再有效。
在研究here时,我意识到我从未将“com.sun.jndi.ldap.connect.pool.protocol”属性设置为“plain ssl”,因为默认情况下它设置为plain。我认为这是问题所在。
当我实现更改以包含“plain ssl”时,它没有解决问题,并且仍然没有使用连接池。
我还缺少其他一些设置吗?
相关代码:
Hashtable LDAPEnvironment = new Hashtable();
LDAPEnvironment.put(Context.SECURITY_AUTHENTICATION, SECURITY_AUTHENTICATION);
LDAPEnvironment.put(Context.SECURITY_PRINCIPAL, SECURITY_PRINCIPAL);
LDAPEnvironment.put(Context.SECURITY_CREDENTIALS, SECURITY_CREDENTIALS);
LDAPEnvironment.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
LDAPEnvironment.put(Context.PROVIDER_URL, PROVIDER_URL );
LDAPEnvironment.put(Context.SECURITY_AUTHENTICATION, "simple");
LDAPEnvironment.put("java.naming.ldap.version", versionOfLDAP );
if (ldapProtocol != null && ldapProtocol.equalsIgnoreCase("SSL")){
LDAPEnvironment.put(Context.SECURITY_PROTOCOL,"ssl");
LDAPEnvironment.put("com.sun.jndi.ldap.connect.pool.protocol","plain ssl");
}
LDAPEnvironment.put("com.sun.jndi.ldap.connect.pool", "true");
答案 0 :(得分:1)
我发现了这个问题。该文档明确指出这些属性是系统属性和不是环境属性。我将它们设置为环境属性。 : - )
答案 1 :(得分:0)
如果向下滚动一下,在您提供的链接处(滚动到“如何汇集连接”),您将看到有关池如何工作的说明。
当您请求池化连接时,仅当所有指定的属性相同时才会获得一个连接。这是一长串属性......
我的情况是:
如果在从连接池请求连接时总是使用相同的常量,我认为您应该获得相同的池连接。也就是说,如果正确设置com.sun.jndi.ldap.connect.pool。*属性 - 但我在您提供的代码中没有看到。
如果您确实将com.sun.jndi.ldap.connect.pool。*属性设置为合理值,请尝试将com.sun.jndi.ldap.connect.pool.debug设置为fine。这将帮助您调试。
另一种选择是使用支持连接池的框架或提供程序。请注意,Java提供给您的池非常有限。我过去使用过Spring-Ldap,它有很好的支持。
希望这有帮助。