sexta-feira, 6 de março de 2009

Broken pipe: A SOLUÇÃO CORRETA

Não vou negar... quebrei muito a cabeça com esse problema em um sistema que recebe conexões via socket, o problema se dava quando ficava muito tempo se receber conexões, eis que acabava gerando o erro "Broken pipe"... e nada mais funcionava, a minha primeira tentativa (com sucesso) mas não muito elegante, pois poderia acarretar em outros problemas está no post:
http://netbeando.blogspot.com/2008/06/broken-pipe-conexo-com-socket-no-banco.html

Bom, agora apresento a solução mais elegante...

1) Para criar um pool de conexões com o banco, inclua no seu projeto a biblioteca c3p0 e faça a conexão dessa forma:

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/nome_base_dados");
cpds.setUser("usuario_banco");
cpds.setPassword("senha_usuario_banco");
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
cpds.setIdleConnectionTestPeriod(60);
cpds.setMaxStatements(0);
cpds.setInitialPoolSize(3);
cpds.setPreferredTestQuery("select 1");
cpds.setCheckoutTimeout(1000);

con = cpds.getConnection();

Essas foram as configurações que eu utilizei para testes no meu tipo de sistema, pesquise sobre o c3p0 e veja quais serão as que se adaptam melhor ao seu problema.

2) Por último, mas não menos importante, sete a propriedade do socket (server) que recebe as conexões do cliente:

private static Socket conexao;
.
.
.
public static void main(String[] args) {
.
.
.
conexao.setKeepAlive(true);
.
.
.
}


Fazendo esses 2 itens resolveu completamente o problema.

Espero que ajude a você também...

4 comentários:

Tiago Augusto disse...

Você utilizava já o C3po? E qual das propriedades você adicionou para não ocorrer o erro?

Jerônimo disse...

Olá Tiago,

Nunca utilizei o c3p0 antes. Quanto as propriedades, eu não incluí nenhuma referente ao c3p0 no arquivo persistence.xml, inseri todas as configurações dele diretamente no código, como descrito no passo 1, alí onde foi criado o objeto "cpds", pesquise no Google sobre esses parâmetros, são muito interessantes e você vai encontrar bastante material, vale a pena dar uma boa olhada. E pelos testes que eu fiz, foi necessário colocar o meu ServerSocket como KeepAlive (passo 2), sem isso também não tinha resolvido o problema.

[]'s

Luciano disse...

Estou com o mesmo problema e utilizo o dbcp da apache com tomcat. Como faço para setar essa propriedade keepAlive direto no servidor de aplicação?

Jerônimo disse...

Olá Luciano,

Infelizmente não posso te ajudar, nunca utilizei o Tomcat...

Espero que você encontre a solução.

[]'s