Commit não funciona sem fechar a conexão

Boa tarde pessoal !

Tinha um outro post mas preferi abrir este para ser mais específico na minha dúvida.

A situação é a seguinte:

Tenho uma classe ConnectionFactory que me retorna uma conexão com um banco de dados MySql.
Estou setando o autoCommit para false.

No entanto as minhas classes de persistência só inserem efetivamente um registro ou fazem um update se eu fechar a conexão com o comando conn.close();

Isto esta correto ? Lembrando que após o insert ou update eu coloco conn.commit().

Obrigado.

Um abraço a todos.

Hm, nao isso nao parece estar correto.

Mesmo porque a ideia de ter um connectionfactory é interessante para aproveitar uma conexao aberta, visto que o custo de abrir uma conexao costuma ser alto.

Voce pode postar o codigo pra gente ver?

La vai:

Classe que cria e retorna uma conexão:


/*
 * ConnectionFactory.java
 *
 * Created on 28 de Maio de 2007, 17:33
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.atm.DAO;

import atm.*;
import java.sql.*;
import javax.swing.JOptionPane;

/**
 *
 * @author r100320
 */
public class ConnectionFactory {        
    private static ConnectionFactory instanciaUnica = null;
    private Connection conn = null;    
    private static int clientes = 0;
    
                
                Class.forName("com.mysql.jdbc.Driver");
                System.out.println("Conectando ao banco MySql...");
                conn = DriverManager.getConnection("jdbc:mysql://localhost/atmDB",
                                                "root","D78_hc121");   
                
                conn.setAutoCommit(false);
                System.out.println("Conectado ao banco MySql...");
                                   

        } catch (ClassNotFoundException e){
                JOptionPane.showMessageDialog(null,"Falha na conexão com o banco de dados \n" + e.getMessage()) ;
                e.printStackTrace();
        } catch (SQLException e ) {
                JOptionPane.showMessageDialog(null,"Falha na conexão com o banco de dados \n" + e.getMessage()) ;
                e.printStackTrace();
        }
    } 
    
    public static ConnectionFactory getInstance(){
        if (instanciaUnica == null) {
            instanciaUnica = new ConnectionFactory();
        } 
        return instanciaUnica;
    }
    
    public Connection getConnection(){
        if (conn == null){
            System.out.println("Conexão nula");
            throw new RuntimeException("Conexão nula");
        }
        clientes++;
        System.out.println("Conexão " + clientes);
        return conn;        
    }
    
    public void shutDown(){
        System.out.println("Shutdown " + clientes);
        clientes--;
        if (clientes > 0) 
            return;
        
        try {
            conn.close();
            instanciaUnica = null;
            System.out.println("Conexão fechada");
            conn = null;
        } catch (SQLException sqle) {
            System.out.println(sqle);
        }
    }
}

Classe que faz uma persistencia:

/*
 * Perfil.java
 *
 * Created on 29 de Maio de 2007, 17:39
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.atm.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author r100320
 */
public class PerfilDAO {
    private Connection conn = null;
    private PreparedStatement stp;
    private ResultSet rs;    

    /** Creates a new instance of UsuarioDAO */
    public PerfilDAO() {
    }

    public void atualizaPerfil(Perfil perfil){
        try {
            conn = ConnectionFactory.getInstance().getConnection();                    
            stp = conn.prepareStatement("Update perfil set pe_peDescricao = ? where pe_peID = ?") ;
            
            stp.setString(1,perfil.getPepeDescricao());
            stp.setInt(2, perfil.getPepeID());
            
            stp.executeUpdate();            
            stp.close();
            conn.commit();
           
        } catch (SQLException ex) {
            try {
                conn.rollback();
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null,"Falha na execução de rollback. Alteração cancelada. \n" + e.getMessage()) ;
                e.printStackTrace();
            }
            JOptionPane.showMessageDialog(null,"Falha na atualização do registro. \n" + ex.getMessage()) ;
            ex.printStackTrace();
            
        }
    }    
    
    public void apagaPerfil(int peId){
        try {
            conn = ConnectionFactory.getInstance().getConnection();                    
            stp = conn.prepareStatement("Delete from perfil where pe_peID = ?");
            
            stp.setInt(1,peId);
            stp.executeUpdate();            
            stp.close();
            conn.commit();
           
        } catch (SQLException ex) {
            try {
                conn.rollback();                
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null,"Falha na execução de rollback. Exclusão cancelada. \n" + e.getMessage()) ;
                e.printStackTrace();
            }
            JOptionPane.showMessageDialog(null,"Falha na exclusão do registro. \n" + ex.getMessage()) ;
            ex.printStackTrace();
        }
    }    
    
    public List <Perfil> buscarListaPerfil() {
        Perfil perfilTemp = null;
        List <Perfil> listaPerfilTemp = new ArrayList <Perfil> ();
                
        try {
            conn = ConnectionFactory.getInstance().getConnection();
            stp = conn.prepareStatement("Select * from perfil order by pe_peid");
            rs = stp.executeQuery();

            while (rs.next()) {
                perfilTemp = new Perfil(rs.getInt("pe_peID"),rs.getString("pe_peDescricao"));
                listaPerfilTemp.add(perfilTemp);
            }
            rs.close();
            stp.close();
            //ConnectionFactory.getInstance().shutDown();
            
            
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Falha na seleção dos registros. \n" + ex.getMessage()) ;
            ex.printStackTrace();
        }
        return listaPerfilTemp;
    }
}

Valeu !