gpt4 book ai didi

java - 使用自定义套接字工厂池化 LDAP 连接

转载 作者:行者123 更新时间:2023-12-02 05:47:44 25 4
gpt4 key购买 nike

我的 Java Web 应用程序正在使用 LDAP 后端进行身份验证/授权。我目前正在使用自定义套接字工厂,并且出于性能原因希望启用连接池。

困惑开始了。

根据标准JNDI教程here如果 Context 实例将其“java.naming.ldap.factory.socket”属性设置为自定义套接字工厂类,则该实例无法使用池连接

但是,根据官方(Java 6)JNDI文档here , 当设置了 java.naming.ldap.factory.socket 环境属性时,允许从自定义套接字工厂池化连接。对于要池化的自定义套接字工厂,套接字工厂类必须实现 Comparator 接口(interface)。

令人鼓舞。到目前为止我所做的:

  • 我的自定义套接字工厂实现 Comparator<SocketFactory>简单比较一下主机+端口
  • 创建我的 LdapContext 时,我愿意env.put("java.naming.ldap.factory.socket", "portal.ldap.util.PortalSocketFactory")env.put("com.sun.jndi.ldap.connect.pool", "true")
  • 我的 Tomcat 服务器以 -Dcom.sun.jndi.ldap.connect.pool.initsize=10 -Dcom.sun.jndi.ldap.connect.pool.maxsize=20 -Dcom.sun.jndi.ldap.connect.pool.prefsize=10 -Dcom.sun.jndi.ldap.connect.pool.timeout=300000 -Dcom.sun.jndi.ldap.connect.pool.protocol="plain ssl" -Dcom.sun.jndi.ldap.connect.pool.debug="all" 启动

接下来进行测试。我连接到应用程序,它连接到 LDAP 服务器,然后发现 - 创建了一个连接池。显然,我的自定义套接字工厂已被接受:

com.sun.jndi.ldap.pool.Pool@26cd2192 {}.get(): 172.17.2.91:636:ssl::portal.ldap.util.PortalSocketFactory:cn=PortalProxy,ou=sa,o=config
com.sun.jndi.ldap.pool.Pool@26cd2192 {}.size: 0
com.sun.jndi.ldap.pool.Pool@26cd2192 {}.get(): creating new connections list for 172.17.2.91:636:ssl::portal.ldap.util.PortalSocketFactory:cn=PortalProxy,ou=sa,o=config
com.sun.jndi.ldap.pool.Connections@65fe28a7.init size=10; size: 0
com.sun.jndi.ldap.pool.Connections@65fe28a7.max size=20; size: 0
com.sun.jndi.ldap.pool.Connections@65fe28a7.preferred size=10; size: 0
Create com.sun.jndi.ldap.LdapClient@127e942f[172.17.2.91:636]
<snip>
Create com.sun.jndi.ldap.LdapClient@3c7038b9[172.17.2.91:636]
com.sun.jndi.ldap.pool.Pool@26cd2192 {172.17.2.91:636:ssl::portal.ldap.util.PortalSocketFactory:cn=PortalProxy,ou=sa,o=config=com.sun.jndi.ldap.pool.ConnectionsRef@6b9c18ae}.get(): size after: 1
com.sun.jndi.ldap.pool.Connections@65fe28a7.get(): before; size: 10
ConnectionDesc.tryUse() com.sun.jndi.ldap.LdapClient@127e942f idle
com.sun.jndi.ldap.pool.Connections@65fe28a7.get(): use com.sun.jndi.ldap.LdapClient@127e942f; size: 10
Use com.sun.jndi.ldap.LdapClient@127e942f
com.sun.jndi.ldap.pool.Connections@65fe28a7.get(): after; size: 10

但是你猜对了,有些东西已经腐烂了。现在,每次应用程序连接时,都会实例化一个新池!我可以看到连接实际上已合并到池中,因为在配置的 300 秒后,它们会过期并从池中删除:

ConnectionDesc.expire(): not expired com.sun.jndi.ldap.LdapClient@e6c7a64 idle
ConnectionDesc.expire(): expired com.sun.jndi.ldap.LdapClient@39579371 idle
com.sun.jndi.ldap.pool.Connections@13a9192b.expire(): removing com.sun.jndi.ldap.LdapClient@39579371 expired; size: 10
Expired com.sun.jndi.ldap.LdapClient@39579371 expired
ConnectionDesc.expire(): expired com.sun.jndi.ldap.LdapClient@2ada52a1 idle
com.sun.jndi.ldap.pool.Connections@13a9192b.expire(): removing com.sun.jndi.ldap.LdapClient@2ada52a1 expired; size: 9
Expired com.sun.jndi.ldap.LdapClient@2ada52a1 expired
<and so on>

救命!我是否遗漏了一些小细节?有没有人成功地让它发挥作用?

最佳答案

如果您查看actual code进行比较,你会发现这绝对是一个错误。它预计 Comparator<String>而不是Comparator<SocketFactory> 。正在传递工厂的类名,而不是工厂本身。在运行时ClassCastException被吞掉并且 false is returned 。这就是为什么你无法从compare看到你的“debug println()”。方法——它永远不会被执行。

关于java - 使用自定义套接字工厂池化 LDAP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com