Cordiais saudações.
Com a ajuda do meu colega Staroski (que fez umas modificações criando um objeto chamado instance) tenho uma classe BD que faz conexão com banco de dados empresa de MySQL.
Dentro dos programas que fazem uso de tabelas eu uso a classe BD para abrir conexão ou fechar.
Veja os comandos para abrir e para fechar, respectivamente:
abrir:
public ForDAO() {
bd = BD.getInstance();
fornecedor = new Fornecedores();
}
fechar:
BD.getInstance().close();
O comando para abrir conexão se encontra em todos os arquivos de classes DAO e o comando para fechar se encontra em todas classes de manipulação de cadastros e tabelas abertas pelo DAO.
No programa BD que é a classe onde está o método getInstance() e close() há uma verificação se existe uma conexão se não houver ao ser solicitada pelos DAO a classe BD é criada.
Gostaria de saber porque não posso fazer a referência difereta BD.close(), onde close() é o método de BD que fecha a conexão e torna nulo o objeto instance. Veja o programa BD abaixo:
package empresaiv;
import java.sql.*;
/**
* @author Ronaldo R. Godoi, contibuição de Staroski
*/
public final class BD {
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DBNAME = "empresa";
private static final String URL = "jdbc:mysql://localhost:3306/" + DBNAME;
private static final String LOGIN = "root";
private static final String SENHA = "04latosensu10";
/**
* Única instância desta classe
*/
private static BD instance;
/**
* Obtém a única instância desta classe
*/
public static synchronized BD getInstance() {
if (instance == null) {
System.out.println("Criando objeto da classe BD");
instance = new BD();
}
System.out.println("Retornando objeto existente da classe BD");
return instance;
}
public final Connection connection;
/**
* Construtor privado
*/
private BD() {
try {
Class.forName(DRIVER);
connection = DriverManager.getConnection(URL, LOGIN, SENHA);
System.out.println("Conectou! ");
} catch (Throwable t) {
throw new RuntimeException("Erro ao inicializar BD", t);
}
}
/**
* Fecha a conexão com o banco
*/
public void close() {
try {
connection.close();
instance = null;
System.out.println("Desconectou...");
} catch(Throwable t) {
throw new RuntimeException("Erro ao fechar BD", t);
}
}
}
Eu gostaria de saber porque deve fazer a referência BD.getInstance().close(), se o método close pertence a BD. Não posso dizer simplesmente BD.close(). Porque?
Também gostaria de saber se o método que esta sendo executado quando chamo BD.getInstance().close() é realmente o método close da classe BD, e então é ele?
Atenciosamente,
Ronaldo