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

2 respostas
I

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
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
      <property name="url" value="jdbc:jtds:sqlserver://127.0.0.1:1434/Banco" />      
      <property name="username" value="sa" />
      <property name="password" value="senha" />
</bean>

<bean id="dao" class="br.com.banco.web.disparo.dao.impl.RemetenteDestinatarioDaoImpl">
      <property name="dataSource" ref="dataSource" />
</bean>

classe:

private DataSource dataSource;	

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

public List<RemetenteDestinatario> 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;		
}

Alguem pode ajudar??

Agradeço desde já!

2 Respostas

K

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:

I

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) :)

Obrigada kicolobo!

Vou da uma pesquisada.

Criado 29 de julho de 2013
Ultima resposta 29 de jul. de 2013
Respostas 2
Participantes 2