[EDIT]Bom resumo das soluções usadas podem ser encontrada neste post => http://blog.caelum.com.br/2009/10/19/a-java-net-socketexception-broken-pipe/[/EDIT]
Opa pessoal, aqui no GUJ vocês usam c3p0 ??
andei tendo problemas de brokenpipe algumas poucas vezes essa semana navegando aqui pelo site do GUJ. passei por um perrengue grande la na empresa, pra resolver um problema similar.
Meu servidor MySQL estava configurado para resetar a cada 20s, e então 20 segundos sem ninguem entrar no site, e o pool de conexões do hibernate ia por agua abaixo, ao criar um session o hibernate não verifica se as suas conexão do pool estão realmente abertas, ele apenas pega uma e a devolve, e então quando você tenta usar a session recebe uma exceção de broken pipe, conforme recebi algumas vezes acessando aqui o guj, a exceção ta no final deste post.
Aumentei para 500 segundos, e então configurei o c3p0, para renovar caso houvesse ociosidade por 100 segundos,
[EDIT] as linhas abaixo descobri que não era o caso, o problema era outras configurações do banco, que falo no final deste post, e no post do Paulo Silveira.[/EDIT]
[not-true]o problema é que aparentemente o c3p0 tem uma forma estranha de renovar a conexão, ele renova a que esta ociosa a mais de 100 segundos e renova também todas as outras, então a cada 100 segundos, todo meu pool tomava um reset, gerando mais broken pipe, pois se uma das sessões não ociovas estivesse em uso no momento do reset o usuario recebia um broken pipe no meio da requisição[/not-true]
não sei se foi problema por não entender a configuração do c3p0, mas li diversos artigos configurei igual varios lugares, e o comportamento se mantinha, não conseguindo configurar o c3p0, acabei sendo vencido, e mudei de approche.
envolvi a factory de sessão com um check, para verificar diretanemente na connection se a conexão estava ativa (já que quando a session é criada o hiberante não as checa).
[EDIT]já não estou usando mais esse trecho abaixo, consegui solucionar sem ter que testar a cada conexão que sai do pool, e configurei o c3p0.[/EDIT]
try {
if (!session.connection().isValid(1)) {
session.reconnect(null);
logger.warn("connection was lost, reconnect was made");
}
} catch (SQLException ex) {
logger.error("fail trying to reconnect to database", ex);
throw new PersistenceException("fail trying to reconnect to database",ex);
}
A abordagem funciona, sempre que uma conexão expira, eu a recupero-a passando por esse trecho.
Porem fiquei intrigado com esse problema e com esta solução, e tenho medo de ser algo muito POG.
Já fiz diversos teste com este approche, inclusive dando kills na conexão para simular o timeout, e a conexão sempre se recupera.
Gostaria de saber como o GUJ lida com os broken pipe, e como é feito o pool de conexão de vocês.
Segue abaixo a exceção que tive aqui no GUJ, esta exceção é a mesma que recebia no meu servidor quando rolava timeout.
[code]<!-- BEGIN ERROR STACK TRACE
net.jforum.exceptions.ForumException: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor244.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at net.jforum.Command.process(Command.java:114)
at net.jforum.JForum.processCommand(JForum.java:217)
at net.jforum.JForum.service(JForum.java:200)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1097)
at net.jforum.util.legacy.clickstream.ClickstreamFilter.doFilter(ClickstreamFilter.java:59)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:206)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.StatisticsHandler.handle(StatisticsHandler.java:89)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Caused by: java.lang.reflect.InvocationTargetException
… 29 more
Caused by: net.jforum.exceptions.DatabaseException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 1 ms ago.
at sun.reflect.GeneratedConstructorAccessor50.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3246)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
at net.jforum.dao.generic.GenericPostDAO.selectById(GenericPostDAO.java:83)
at net.jforum.view.forum.PostAction.editSave(PostAction.java:754)
… 29 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 1 ms ago.
… 43 more
Caused by: java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3227)
… 37 more
URL is: /jforum.java?null
END ERROR STACK TRACE–>[/code]