Como solucionar esse tipo de erro "No operations allowed after connection closed"?[Resolvido]

3 respostas
A

Boa Tarde Caros,

Estou fazendo um programa no modelo DAO('Data Acess Object'), mas está dando erro acima,
no entanto, eu abri e fechei a conexão direitinho...
O código mostrarei abaixo:

//CONEXAODAO

public class ConexaoDao {
	
	 Connection connection = null;
	 PreparedStatement sql = null;
	 ResultSet rs = null;
	
	public void openDataBase() throws Exception
	{
		if (connection == null) 
		{
			String url = "jdbc:mysql://localhost:3306/biblioteca";
		    String user = "root";
		    String passwd = "";
		    connection = DriverManager.getConnection(url,user,passwd);
		}
	}
	public void closeDataBase() throws Exception
	{
		if ( connection != null)
		{
			connection.close();
		}
		if ( connection != null)
		{
			sql.close();
		}
	}

}
//DAO
public void inserirMaterial ( Material objMaterial ) throws Exception
	{
		openDataBase();
		sql = connection.prepareStatement("insert into material(titulo,situacao) values (?,?)");
		sql.setString(1, objMaterial.getTitulo());
        sql.setInt(2, objMaterial.getSituacao());
        sql.execute();
        closeDataBase();
	}
public int buscarUltimoId() throws Exception
	{
		openDataBase();
		int idMaterial = 0;
		sql = connection.prepareStatement("Select MAX(id_material) from material; ");
		rs = sql.executeQuery();
		if ( rs.next())
		{
			idMaterial = rs.getInt(1);
		}
		closeDataBase();
		return idMaterial;
	}
//MAIN
pubDao = new PublicacaoDao();
					revDao = new RevistaDao();
					System.out.printf("Entre com o nome da revista: ");
					mat.setTitulo(sc.next());
					System.out.printf("Entre com o situação(numeros): ");
					mat.setSituacao(sc.nextInt());
					matDao = new MaterialDao();
					matDao.inserirMaterial(mat); // Até aqui funciona certinho, depois dá aquele erro mencionado acima
					pub.setIdPublicacao(matDao.buscarUltimoId()); // Eu tenho pegar o id do material para inserir na publicacao
					pubDao.inserePublicacao(pub);
					System.out.printf("Entre com a edição da revista:");
					rev.setEdicao(sc.nextLine());
					rev.setIdRevista(pubDao.buscarUltimoId()); // Eu tenho pegar o id da publicacao e inserir na Revista
					revDao.insereRevista(rev);
					System.out.println("A revista "+mat.getTitulo()+" foi cadastrada com sucesso!");

Muito Obrigado,
Att, André Vieira

3 Respostas

drsmachado

O problema está aqui:

matDao.inserirMaterial(mat); // Até aqui funciona certinho, depois dá aquele erro mencionado acima  
                    pub.setIdPublicacao(matDao.buscarUltimoId()); // Eu tenho pegar o id do material para inserir na publicacao

Quando a tua classe insere um material, ela invoca o método

closeDataBase();

closeDataBase() apenas fecha a conexão (invoca o método close())

public void closeDataBase() throws Exception { if ( connection != null) { connection.close(); } if ( connection != null) { sql.close(); } }
Porém, o objeto permanece “vivo” e não nulo.
Quando você invoca

pub.setIdPublicacao(matDao.buscarUltimoId()); // Eu tenho pegar o id do material para inserir na publicacao
O método

public int buscarUltimoId() throws Exception  
    {  
        openDataBase();  
        int idMaterial = 0;  
        sql = connection.prepareStatement("Select MAX(id_material) from material; ");  
        rs = sql.executeQuery();  
        if ( rs.next())  
        {  
            idMaterial = rs.getInt(1);  
        }  
        closeDataBase();  
        return idMaterial;  
    }

Invoca openDataBase(); que, realiza a análise do seguinte if

if (connection == null) { String url = "jdbc:mysql://localhost:3306/biblioteca"; String user = "root"; String passwd = ""; connection = DriverManager.getConnection(url,user,passwd); }
E, como o objeto connection != null, ele não entra no trecho de código existente no if. Lembre-se, connection foi apenas fechado, não foi anulado, em nenhum momento.

Como o método buscarUltimoId() segue seu fluxo, ele invoca

sql = connection.prepareStatement("Select MAX(id_material) from material; ");
E como connection está fechado, você recebe a exception que dá título ao tópico.

Soluções:
Após fechar a conexão, pode fazer:

connection = null;

Ou, no if:

if(connection == null || !connection.isOpen()){

Isso elimina qualquer possibilidade de receber ESTA exceção.

F

Por que vc tá fazendo 2 if’s iguais?

if ( connection != null)  
        {  
            connection.close();  
        }  
        if ( connection != null)  
        {  
            sql.close();  
        }

Não seria melhor:

if ( connection != null)  
        {  
            sql.close();
            connection.close();  
        }
A

drsmachado:
O problema está aqui:

matDao.inserirMaterial(mat); // Até aqui funciona certinho, depois dá aquele erro mencionado acima  
                    pub.setIdPublicacao(matDao.buscarUltimoId()); // Eu tenho pegar o id do material para inserir na publicacao

Quando a tua classe insere um material, ela invoca o método

closeDataBase();

closeDataBase() apenas fecha a conexão (invoca o método close())

public void closeDataBase() throws Exception { if ( connection != null) { connection.close(); } if ( connection != null) { sql.close(); } }
Porém, o objeto permanece “vivo” e não nulo.
Quando você invoca

pub.setIdPublicacao(matDao.buscarUltimoId()); // Eu tenho pegar o id do material para inserir na publicacao
O método

public int buscarUltimoId() throws Exception  
    {  
        openDataBase();  
        int idMaterial = 0;  
        sql = connection.prepareStatement("Select MAX(id_material) from material; ");  
        rs = sql.executeQuery();  
        if ( rs.next())  
        {  
            idMaterial = rs.getInt(1);  
        }  
        closeDataBase();  
        return idMaterial;  
    }

Invoca openDataBase(); que, realiza a análise do seguinte if

if (connection == null) { String url = "jdbc:mysql://localhost:3306/biblioteca"; String user = "root"; String passwd = ""; connection = DriverManager.getConnection(url,user,passwd); }
E, como o objeto connection != null, ele não entra no trecho de código existente no if. Lembre-se, connection foi apenas fechado, não foi anulado, em nenhum momento.

Como o método buscarUltimoId() segue seu fluxo, ele invoca

sql = connection.prepareStatement("Select MAX(id_material) from material; ");
E como connection está fechado, você recebe a exception que dá título ao tópico.

Soluções:
Após fechar a conexão, pode fazer:

connection = null;

Ou, no if:

if(connection == null || !connection.isOpen()){

Isso elimina qualquer possibilidade de receber ESTA exceção.

Era isso mesmo, valeu Fera! Eu deixei sem IF mesmo.
Abraço

Criado 20 de junho de 2012
Ultima resposta 20 de jun. de 2012
Respostas 3
Participantes 3