Tomcat Spring LDAP连接池-使用MutablePoolgContextSource时文件句柄未关闭

Tomcat Spring LDAP连接池-使用MutablePoolgContextSource时文件句柄未关闭,tomcat,file-handling,spring-ldap,Tomcat,File Handling,Spring Ldap,在使用SpringLDAP连接池时,我不断遇到以下异常。LDAP连接已经建立,乍一看一切正常,直到最后tomcat在超过文件句柄大小限制后挂起,因为显然套接字没有关闭。你知道为什么会出现这个问题以及如何解决吗 谢谢,比尔, 埃尔玛 Spring异常: 121295 [Timer-2] INFO org.springframework.ldap.pool.validation.DefaultDi rContextValidator []- DirContext 'javax.naming.ldap

在使用SpringLDAP连接池时,我不断遇到以下异常。LDAP连接已经建立,乍一看一切正常,直到最后tomcat在超过文件句柄大小限制后挂起,因为显然套接字没有关闭。你知道为什么会出现这个问题以及如何解决吗

谢谢,比尔, 埃尔玛

Spring异常:

121295 [Timer-2] INFO org.springframework.ldap.pool.validation.DefaultDi rContextValidator []- DirContext 'javax.naming.ldap.InitialLdapContext@5034d0fe' failed validation.
121295 [Timer-2] WARN org.springframework.ldap.pool.validation.DefaultDi rContextValidator []- DirContext 'javax.naming.ldap.InitialLdapContext@432d76f2' failed validation with an exception.
javax.naming.CommunicationException: Connection reset [Root exception is java.net.SocketException: Connection reset]; remaining name ''
    at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:20 03)
    at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1 847)
    at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:17 72)
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_sea rch(ComponentDirContext.java:386)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContex t.search(PartialCompositeDirContext.java:356)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContex t.search(PartialCompositeDirContext.java:339)
    at javax.naming.directory.InitialDirContext.search(In itialDirContext.java:267)
    at org.springframework.ldap.pool.validation.DefaultDi rContextValidator.validateDirContext(DefaultDirCon textValidator.java:165)
    at org.springframework.ldap.pool.factory.DirContextPo olableObjectFactory.validateObject(DirContextPoola bleObjectFactory.java:169)
    at org.apache.commons.pool.impl.GenericKeyedObjectPoo l.evict(GenericKeyedObjectPool.java:1897)
    at org.apache.commons.pool.impl.GenericKeyedObjectPoo l$Evictor.run(GenericKeyedObjectPool.java:2272)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream. java:189)
    at java.net.SocketInputStream.read(SocketInputStream. java:121)
    at java.io.BufferedInputStream.fill(BufferedInputStre am.java:235)
    at java.io.BufferedInputStream.read1(BufferedInputStr eam.java:275)
    at java.io.BufferedInputStream.read(BufferedInputStre am.java:334)
    at com.sun.jndi.ldap.Connection.run(Connection.java:8 49)
    at java.lang.Thread.run(Thread.java:724)   
Dec 14, 2013 1:05:57 PM org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
SEVERE: Socket accept failed
java.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
    at java.net.ServerSocket.implAccept(ServerSocket.java:530)
    at java.net.ServerSocket.accept(ServerSocket.java:498)
    at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
    at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
    at java.lang.Thread.run(Thread.java:724)
Tomcat异常:

121295 [Timer-2] INFO org.springframework.ldap.pool.validation.DefaultDi rContextValidator []- DirContext 'javax.naming.ldap.InitialLdapContext@5034d0fe' failed validation.
121295 [Timer-2] WARN org.springframework.ldap.pool.validation.DefaultDi rContextValidator []- DirContext 'javax.naming.ldap.InitialLdapContext@432d76f2' failed validation with an exception.
javax.naming.CommunicationException: Connection reset [Root exception is java.net.SocketException: Connection reset]; remaining name ''
    at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:20 03)
    at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1 847)
    at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:17 72)
    at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_sea rch(ComponentDirContext.java:386)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContex t.search(PartialCompositeDirContext.java:356)
    at com.sun.jndi.toolkit.ctx.PartialCompositeDirContex t.search(PartialCompositeDirContext.java:339)
    at javax.naming.directory.InitialDirContext.search(In itialDirContext.java:267)
    at org.springframework.ldap.pool.validation.DefaultDi rContextValidator.validateDirContext(DefaultDirCon textValidator.java:165)
    at org.springframework.ldap.pool.factory.DirContextPo olableObjectFactory.validateObject(DirContextPoola bleObjectFactory.java:169)
    at org.apache.commons.pool.impl.GenericKeyedObjectPoo l.evict(GenericKeyedObjectPool.java:1897)
    at org.apache.commons.pool.impl.GenericKeyedObjectPoo l$Evictor.run(GenericKeyedObjectPool.java:2272)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream. java:189)
    at java.net.SocketInputStream.read(SocketInputStream. java:121)
    at java.io.BufferedInputStream.fill(BufferedInputStre am.java:235)
    at java.io.BufferedInputStream.read1(BufferedInputStr eam.java:275)
    at java.io.BufferedInputStream.read(BufferedInputStre am.java:334)
    at com.sun.jndi.ldap.Connection.run(Connection.java:8 49)
    at java.lang.Thread.run(Thread.java:724)   
Dec 14, 2013 1:05:57 PM org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
SEVERE: Socket accept failed
java.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
    at java.net.ServerSocket.implAccept(ServerSocket.java:530)
    at java.net.ServerSocket.accept(ServerSocket.java:498)
    at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
    at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
    at java.lang.Thread.run(Thread.java:724)
以下是ldap连接池配置:

<bean id="sdLdapTemplate" class="org.springframework.ldap.core.LdapTemplate">
    <property name="contextSource" ref="sdContextSource" />
    <!-- <property name="contextSource" ref="sdContextSourceTarget" /> -->
</bean>

<bean id="sdContextSource"
    class="org.springframework.ldap.transaction.compensating.manager.TransactionAwareContextSourceProxy">
    <constructor-arg ref="sdPooledContextSource" />
</bean>

<bean id="sdPooledContextSource"
    class="org.springframework.ldap.pool.factory.MutablePoolingContextSource">
    <property name="contextSource" ref="sdContextSourceTarget" />
    <property name="dirContextValidator" ref="dirContextValidator" />
    <property name="testOnBorrow" value="false" />
    <property name="testWhileIdle" value="true" />
    <property name="minIdle" value="3" />
    <property name="maxIdle" value="8" />
    <property name="maxActive" value="100" />
    <property name="maxTotal" value="100" />
    <property name="maxWait" value="100" />
    <property name="timeBetweenEvictionRunsMillis" value="60000" />
    <property name="minEvictableIdleTimeMillis" value="180000" />
</bean>

<bean id="sdContextSourceTarget" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="url" value="${sd.url}" />
    <property name="userDn" value="${sd.account}" />
    <property name="password" value="${sd.pwd}" />
    <property name="pooled" value="false" />
</bean>

<bean id="dirContextValidator"
    class="org.springframework.ldap.pool.validation.DefaultDirContextValidator">
</bean>