Prezados;
Aderi recentemente à utilização de um singleton para tratar a conexão com o banco de dados.
Hospedei recentemente um sistema num servidor onde o SGBD tinha um ‘timeout’ para conexões abertas. Ele então fechava a conexão de seu lado por conta, fazendo com que o singleton retorne uma instância de conexão sem referências gerando uma exception (NullPointer no caso, não de conexão com o banco).
Além disso, mesmo funcionando bem em desenvolvimento será que, se um singleton mantém uma conexão aberta o tempo todo, isso não pode causar um vazamento de memória (“leak”) no host do SGBD?
Por acaso algum de vcs conseguiram implementar um singleton de conexão de forma segura?
Ou, tem alguma opção (sem ser o singleton necessáriamente) que poupe recursos e garanta segurança?
Abaixo está o singleton utilizado.
Obrigado e Abs
public class ConnectionFactory {
private static ConnectionFactory connectionFactory = null;
private static Connection connection = null;
private String url = "jdbc:postgresql://localhost:5432/db";
private String username = "user";
private String password = "senha";
private ConnectionFactory(){ }
public static ConnectionFactory getInstance(){
if(connectionFactory == null)
connectionFactory = new ConnectionFactory();
return connectionFactory;
}
public Connection getConnection() throws ConnectionException{
if(connection == null){
try {
DriverManager.registerDriver(new Driver());
connection = DriverManager.getConnection(url, username, password);
}
catch (SQLException e) {
System.out.println("\n>> Problema ao obter conexao\n");
e.printStackTrace();
throw new ConnectionException();
}
}
return connection;
}
public void closeConnection(){
if(connection != null){
try {
connection.close();
}
catch (SQLException e) {
System.out.println("\n>> Problema ao fechar conexao\n");
e.printStackTrace();
}
}
}
public void finalize(){
closeConnection();
}
}