Zeed01
Novembro 22, 2007, 5:16pm
#1
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.
_Renatu
Novembro 22, 2007, 6:08pm
#2
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?
Zeed01
Novembro 22, 2007, 6:14pm
#3
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 !