Spring >>> conexao funciona ou dá o erro I/O Error: Connection reset

Olá Pessoal!

Tenho um método q preenche uma lista a partir do retorno de uma procedure.
O método e a procedure funciona. O problema é que tem horas que funciona e tem horas que o seguinte erro é mostrado: [color=red]I/O Error: Connection reset[/color]

beans.xml

[code]




[/code]

classe:

[code]private DataSource dataSource;

public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}

public List list() throws SQLException {

Connection connection = null;
CallableStatement proc = null;
ResultSet rs = null;

List<RemetenteDestinatario> listRemetentes = new ArrayList<RemetenteDestinatario>();

try {			
	connection = dataSource.getConnection();
	proc = connection.prepareCall("{ call pSelRemetentes(?) }");			
	proc.setString(1, "N");
	proc.execute();

	rs = proc.getResultSet();

	while (rs.next()) {
		listRemetentes.add(new RemetenteDestinatario(rs.getString(1), rs.getString(2), rs.getLong(7)));
	}

} catch (Exception e) {
	// java.sql.SQLException: I/O Error: Connection reset
	System.out.println("erro >>>> list: " + e.getMessage());
} finally {			
	proc.close();
	connection.close();
}

return listRemetentes;		

}[/code]

Alguem pode ajudar??

Agradeço desde já!

Bom: muito provavelmente o que está ocorrendo é o seguinte: sua aplicação está mantendo uma instância da conexão aberta tempo demais.
Então o servidor de banco de dados por detectar a inatividade da mesma, acaba pro fecha-la, mas sua aplicação ainda não sabe disto.
Quando envia o próximo comando para o banco de dados, este já resetou a conexão e o estado desta, o que gera este erro aí.

A solução para o seu problema é simples: ao invés de usar a conexão do tipo DriverManager, que mantém uma só, use um pool. Os pools normalmente fazem chamadas do tipo “ping” para o banco de dados de tal modo a manter a conexão aberta no servidor, o que minimiza bastante a ocorrência do erro que você está tendo. Aliás, use somente pools, este negócio de usar o DriverManagerDataSource só funciona bem mesmo em ambiente de testes automatizados (e testes que duram pouco e não reaproveitam a conexão) :slight_smile:

[quote=kicolobo]Bom: muito provavelmente o que está ocorrendo é o seguinte: sua aplicação está mantendo uma instância da conexão aberta tempo demais.
Então o servidor de banco de dados por detectar a inatividade da mesma, acaba pro fecha-la, mas sua aplicação ainda não sabe disto.
Quando envia o próximo comando para o banco de dados, este já resetou a conexão e o estado desta, o que gera este erro aí.

A solução para o seu problema é simples: ao invés de usar a conexão do tipo DriverManager, que mantém uma só, use um pool. Os pools normalmente fazem chamadas do tipo “ping” para o banco de dados de tal modo a manter a conexão aberta no servidor, o que minimiza bastante a ocorrência do erro que você está tendo. Aliás, use somente pools, este negócio de usar o DriverManagerDataSource só funciona bem mesmo em ambiente de testes automatizados (e testes que duram pouco e não reaproveitam a conexão) :)[/quote]

Obrigada kicolobo!

Vou da uma pesquisada.