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

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

[code]
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();
	}
}

}[/code]

//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

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.

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();  
        }  

[quote=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.[/quote]

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