Erro Too many open files

Galera estou com um sistema em produção e começou a travar todo servidor fui olhar nos logs e tem o seguinte erro:

14/11/2011 15:38:42 org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
GRAVE: Socket accept failed
java.net.SocketException: Too many open files
        at java.net.PlainSocketImpl.socketAccept(Native Method)
        at java.net.PlainSocketImpl.accept(Unknown Source)
        at java.net.ServerSocket.implAccept(Unknown Source)
        at java.net.ServerSocket.accept(Unknown Source)
        at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:59)
        at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:212)
        at java.lang.Thread.run(Unknown Source)

Tenho uma parte do sistema que eu populo uma tabela de 5 em 5 minutos, para popular ela tenho que ler um arquivo.txt

Para ler o arquivo eu coloco dentro de um try catch


FileReader reader = new FileReader(file);
BufferedReader bf = new BufferedReader(reader);

}finally{
   reader.close();
   bf.close();
}

Dei uma olhada nos foruns mais não sei o que pode estar acontencendo, se alguém puder ajudar agradeço.

cara,

tenta no final da leitura do arquivo, da um flush e ve se resolve.

t+

Vendo o stacktrace, me parece que o problema é que estão abrindo muitas conexões para o Tomcat e elas estão ficando penduradas por algum motivo.
Dai, vai alcançar o limite físico do SO para sockets abertos.
Eu pesquisaria o que poderia estar ficando aberto e impedindo de a thread de Endpoint do Tomcat não estar sendo devidamente encerrada e retornada ao pool de threads.

Tá rodando isso com Tomcat, por acaso?

Sim rodo no tomcat e uso o <p:poll interval=“60” /> do primefaces para executar a consulta em um intervalo de 1 min

Desculpa, não tinha lido o stacktrace direito. Li com pressa e fiz uma pergunta idiota.

Cara, eu passei por isso há pouco tempo. Eu até dei a dica pra lina esses dias num post: monitora teus processos no SO, vẽ quantas conexões estã no estado CLOSE_WAIT. São essas aí que estão travando teu sistema.

(Ninguém me convence de que isso não é um bug do Tomcat, até porquê isso acontece desde a versão 5.5; já foram abertas diversas issues e eles fecham como se estivesse resolvido, e não está).
Ainda que você libere os recursos normalmente, essa porcaria fica aí aguardando “mais um” sinal pra liberação.

Como eu resolvi? De um jeito horrível: System.gc() ao final de cada processo que eu executo.

Detalhe: eu trabalhei 3 semanas com esse sistema, que tava uma confusão desgraçada. Então, é possível que alguém estivesse deixando de fechar algum recurso (como pode ocorrer com você também). Mas eu procurei e não achei nada de errado.

Boa sorte aí!

Junto com ele está acontecendo esse erro tbm

INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@7033bd: defining beans [dataSource,chamadoDAO]; root of factory hierarchy
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Exceção de E/S: The Network Adapter could not establish the connection)
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1225)
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
        at com.br.isdra.sgc.dao.impl.ChamadoDAOImpl.selectChamadosAll(ChamadoDAOImpl.java:34)
        at com.br.isdra.sgc.controller.MonitorAtendimentoController.getListaEmAtendimento(MonitorAtendimentoController.java:54)
        at sun.reflect.GeneratedMethodAccessor50.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
        at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
        at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72)
        at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
        at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
        at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102)
        at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
        at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
        at javax.faces.component.UIData.getValue(UIData.java:554)
        at javax.faces.component.UIData.getDataModel(UIData.java:1248)
        at javax.faces.component.UIData.setRowIndex(UIData.java:447)
        at javax.faces.component.UIData.visitTree(UIData.java:1184)
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457)
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457)
        at javax.faces.component.UIForm.visitTree(UIForm.java:324)
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457)
        at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457)
        at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:223)
        at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:177)
        at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:131)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:430)
        at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:143)
        at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:199)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: Exceção de E/S: The Network Adapter could not establish the connection
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:254)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:386)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:413)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:164)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:34)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:752)
        at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
        at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1247)
        at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1221)
        ... 49 more

É normal. Conexões de banco, socket, stream, pouco importa: no final das contas, é tudo “arquivo”. E eu também passei por isso hehe

Será que devo colocar um Glass Fish ou um Jboss já que teremos uma demanda grande no servidor?