Problema ao fechar conexão

7 respostas
Licuri

Galera estou com um problema chato e talvez simples de ser resolvido só não sei como.
Em minha aplicação em alguns momentos ao acessar o banco de dados, seja em um insert, update, select , etc. É lançada a seguinte exception:

Object has been closed

Estou utilizando Sql server 2000.

Antes de fechar o Callablestatement , ou ResultSet.
faço,

if(statement != null){
statement.close()
}

o mesmo para o ResultSet…

Alguem pode me ajudar?

7 Respostas

V

Em quais momentos ele exibe essa exception ?
vc esta fechando o resultset ?

Licuri

cara sempre que entra neste método.

/**
	 * Fechar CallableStatement e ResultSet 
	 */
	public void closeCallableStatement() throws VIMOException {
		try {

			if (cs != null)
				cs.close();

			if (rs != null)
				rs.close();

		} catch (Exception ex) {
			throw new VIMOException(
				"Problemas ao fechar a callableStatement",
				ex);

		}
	}

Cara o que acontece que este tipo de verificação que eu estou fazendo apenas com o null é furada, pois mesmo fechando o resultSet ou o Statement eles continuam com a instancia na memoria portanto entra dentro do if e tenta fechar novamente, ai que surge o erro.

Tipo não algo como…

rs.isclosed();
Já dei uma olhada na api e não encontrei nada parecido…

Preciso de ajuda mesmo…

valeu… :frowning:

ramilani12

Vc nao esta fechando um Connection antes ? , prq qndo vc fecha um objeto Connection implicitamente fecha o Statement , ResultSet

Licuri

Não cara estou fechando a conexão depois.
Vc esta me dizendo que eu não preciso fechar o statement e nem o result basta fechar a conexão?!

T

O correto é fechar na ordem inversa em que as coisas foram abertas. Você pode tentar algo tão simples quanto:

public void closeCallableStatement() {
               try { if (rs != null) { rs.close(); rs = null; } catch (SQLException ex) {}
               try { if (stmt != null) { stmt.close(); stmt = null; } catch (SQLException ex) {}
               try { if (cs != null) { cs.close(); cs = null; } catch (SQLException ex) {}
       }
Licuri

thingol:
O correto é fechar na ordem inversa em que as coisas foram abertas. Você pode tentar algo tão simples quanto:

public void closeCallableStatement() {
               try { if (rs != null) { rs.close(); rs = null; } catch (SQLException ex) {}
               try { if (stmt != null) { stmt.close(); stmt = null; } catch (SQLException ex) {}
               try { if (cs != null) { cs.close(); cs = null; } catch (SQLException ex) {}
       }

thingol não existe outra forma de verificar se o rs ou stmt são validos?
o que pode ocorrer se eu não fechar o stmt? :roll:

KWill

Licuri:
thingol:
O correto é fechar na ordem inversa em que as coisas foram abertas. Você pode tentar algo tão simples quanto:

public void closeCallableStatement() {
               try { if (rs != null) { rs.close(); rs = null; } catch (SQLException ex) {}
               try { if (stmt != null) { stmt.close(); stmt = null; } catch (SQLException ex) {}
               try { if (cs != null) { cs.close(); cs = null; } catch (SQLException ex) {}
       }

thingol não existe outra forma de verificar se o rs ou stmt são validos?
o que pode ocorrer se eu não fechar o stmt? :roll:

Acredite, acontece o apocalipse se você esquecer de fechar statements e connections, sempre feche seus statements e connections abertos caso não venha a utilizá-los denovo, pois sua aplicação pode cair em Exceptions como o “ORA-01000”, e não voltar a funcionar porque você estourou algum limite, seja de conexões ou de cursores abertos ou então a sua aplicação pode passar a rodar com desempenho inaceitável. Falo por experiência própria :XD: .

Inté.

Criado 20 de novembro de 2006
Ultima resposta 22 de nov. de 2006
Respostas 7
Participantes 5