[RESOLVIDO]Fechar conexão após busca em banco

2 respostas Resolvido
java
D

E ae pessoal do fórum do GUJ.
Estou com esse problema há algumas semanas e ainda não encontrei uma solução para o mesmo.
Uso o banco de dados PostgreSQL, e sempre que eu faço uma busca no banco usando a minha aplicação, ele abre uma conexão porem não a fecha, quando eu abre o CTRL ALT DEL, posso ver que para cada busca ele abre um processo do postgres.exe e não fecha após retornar os dados da busca, simplesmente ficam em aberto, após um grande numero de buscas o banco trava alegando que o limite máximo de conexões foi excedido.
Estou utilizando MVC para desenvolver

Essa é a minha classe que abre a conexão:

package Model;

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.DriverManager;

public class EntidadeConexao {
	private final String url = "jdbc:postgresql://localhost:5432/ordem_servico_db";
	private final String pass = "123";
	private final String user = "postgres";
	
	public Connection abreConexao() throws SQLException {
		return DriverManager.getConnection(url,user,pass);
	}
}

E essa é a classe que faz a busca no banco

package DAO;

import Controller.ValidaLoginUsuario;
import Model.EntidadeConexao;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class UsuariosDAO extends EntidadeConexao {
	private Boolean statusLogin;
	ValidaLoginUsuario retornaControle = new ValidaLoginUsuario();
	
	public void AutenticaLogin(String usuario, String senha) throws SQLException{
		ResultSet rset = null;
		PreparedStatement prs = null;
		String sql = "SELECT usuario,senha FROM usuario WHERE usuario = '"+usuario+"' and senha ='"+senha+"'";
		
		try {
			prs = abreConexao().prepareStatement(sql);
			rset = prs.executeQuery();
			
			if(rset.next() == true) {
				prs.close();
				rset.close();
				abreConexao().close();
				statusLogin = true;
				retornaControle.setStatus(statusLogin);
				retornaControle.statusDoLogin();
			} else {
				prs.close();
				rset.close();
				abreConexao().close();
				statusLogin = false;
				retornaControle.setStatus(statusLogin);
				retornaControle.statusDoLogin();
			}
		} catch(SQLException e) {
			try {
				prs.close();
				rset.close();
				abreConexao().close();
			} catch(SQLException e2) {
				JOptionPane.showMessageDialog(null, e.getMessage());
			}            
		} finally{
			prs.close();
			rset.close();
			abreConexao().close();
		}
	}
}

Estou dando close de todos os jeitos possíveis mas mesmo assim a conexão permanece ativa.

2 Respostas

L
Solucao aceita

Você está chamando o close a partir de uma nova conexão criada, ignorando a conexão criada anteriormente ao executar o statement, pois o método abreConexao sempre retorna uma nova conexão. Com isso, seu método deveria ser assim:

package DAO;

import Controller.ValidaLoginUsuario;
import Model.EntidadeConexao;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class UsuariosDAO extends EntidadeConexao {
	private Boolean statusLogin;
	ValidaLoginUsuario retornaControle = new ValidaLoginUsuario();
	
	public void AutenticaLogin(String usuario, String senha) throws SQLException {
		// Cria a conexão e armazena na variável "conexao" para ser usada em todo o método
		Connection conexao = abreConexao();
		
		ResultSet rset = null;
		PreparedStatement prs = null;
		String sql = "SELECT usuario,senha FROM usuario WHERE usuario = '"+usuario+"' and senha ='"+senha+"'";
		
		try {
			prs = conexao.prepareStatement(sql);
			rset = prs.executeQuery();
			
			if(rset.next() == true) {
				statusLogin = true;
				retornaControle.setStatus(statusLogin);
				retornaControle.statusDoLogin();
			} else {
				statusLogin = false;
				retornaControle.setStatus(statusLogin);
				retornaControle.statusDoLogin();
			}
		} catch(SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage());            
		} finally{
			prs.close();
			rset.close();
			conexao.close();
		}
	}
}
D

Poxa cara, muito obrigado mesmo
Funcionou!

Já tinha uns meses que eu estava tentando descobrir o por que desse problema kk

Resolvido!

Criado 13 de julho de 2016
Ultima resposta 13 de jul. de 2016
Respostas 2
Participantes 2