Singleton de conexão com o SGBD

3 respostas
pgnt

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


	}

3 Respostas

saoj

Uma connection nao eh thread-safe, ou seja, nao pode ser compartilhada por 2 ou mais threads.

E uma conexao nao deve ser mantida aberta ad eterno.

Usa um pool de conexoes que já toma conta de tudo pra vc. Recomendo o c3p0.

71C4700

Normalmente em aplicaçoes Web, onde existem um numero maior de acesso a conexão simutanea ao banco, seria interssante a utilização de um pool de conexão como o DBCP.
A vantagem é que o Container poderia gerenciar isto, descomplando mais uma funcionalidade que não seria necessario implementar no codigo!
uma outra observação seria, caso utilize este Singleton, faça eles serem sincronizados, seria uma outra solução. Apesar de deixar um pouco mais lenta a chamada a este metodo!

pgnt

já vou postar novamente, encontrei um erro

Criado 7 de setembro de 2008
Ultima resposta 8 de set. de 2008
Respostas 3
Participantes 3