Erro Too many open files

8 respostas
diogoprosoft

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.

8 Respostas

A

cara,

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

t+

C

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.

leoramos

Tá rodando isso com Tomcat, por acaso?

diogoprosoft

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

leoramos

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í!

diogoprosoft

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
leoramos

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

diogoprosoft

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

Criado 14 de novembro de 2011
Ultima resposta 14 de nov. de 2011
Respostas 8
Participantes 4