Conexão fecha sozinha

18 respostas
java
A

Ola pessoal, gostaria de obter ajuda por aqui, ja pesquisei bastante tentei varias formas e sempre o mesmo erro. Eu criei um sistema com conexão ao MySql, em uma das funções esse sistema lê uma tabela de excel e insere no banco. Apos ler e inserir as primeiras linhas ele para no item 50 ±, antes de eu mudar a class de conexão ele dava um erro: too many connections apos inserir 150 itens ±, quando olho no server status do meu banco aparece as 152 conexões abertas e eu não consigo fechalas no meu metodo de adicionar. Alguem pode me ajudar?

//Início da classe de conexão//
public class Conexao {
  public static String status = "Não conectou...";

  //Método Construtor da Classe//
  public Conexao() {

  }
  
  //Método de Conexão//
  public static Connection getConexao() {
	  Connection connection = null;          //atributo do tipo Connection
	  try {
		  //Carregando o JDBC Driver padrão
		  String driverName = "com.mysql.jdbc.Driver";                        
		  Class.forName(driverName);
		  //Configurando a nossa conexão com um banco de dados//
          String serverName = "localhost";    //caminho do servidor do BD
          String mydatabase = "registro_dth";        //nome do seu banco de dados
          String url = "jdbc:mysql://" + serverName + "/" + mydatabase;
          String username = "root";        //nome de um usuário de seu BD      
          String password = "usuario123";      //sua senha de acesso
          connection = DriverManager.getConnection(url, username, password);
          //Testa sua conexão//  
          if (connection != null) {
        	  status = ("STATUS--->Conectado com sucesso!");
       	  
          } else {
        	  status = ("STATUS--->Não foi possivel realizar conexão");

          }

          return connection;
      } catch (ClassNotFoundException e) {  //Driver não encontrado
          System.out.println("O driver expecificado nao foi encontrado.");
          return null;
      	} catch (SQLException e) {
      		//Não conseguindo se conectar ao banco
      		System.out.println("Nao foi possivel conectar ao Banco de Dados.");
      		return null;
  		  }
  }



  //Método que retorna o status da sua conexão//

  public static String statusConection() {
      return status;
  }

 
 //Método que fecha sua conexão//
  public static boolean FecharConexao() {
      try {
          Conexao.getConexao().close();
          return true;
      } catch (SQLException e) {
          return false;
      }
  }

 //Inicio da class com metodo adiciona
import java.io.IOException;
import java.sql.Connection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


import javax.swing.JOptionPane;
import br.conexao.com.Conexao;

public class AtributosDoBancoDAO {
	private Connection connection = null;
	private PreparedStatement preparedStatement = null;
	
	public AtributosDoBancoDAO(){
		new Conexao();
		this.connection = Conexao.getConexao();
		
	}
	
	//metode de adicionar ao banco. Usado pelo class Excel Adiciona
	public void adiciona(AtributosDoBanco dados)throws SQLException, IOException{
		String Query = " SELECT no_serie FROM dth_gvt WHERE no_serie =? AND saida = 'false' ";
		
		PreparedStatement statos = connection.prepareStatement(Query);
		statos.setLong(1, dados.getNo_serie());
		ResultSet rs = statos.executeQuery();
		if(rs.next()){
			JOptionPane.showMessageDialog(null,"Este numero de serie ja Existe",Query, 1);
			if(preparedStatement != null){
				//comparar o select com no_serie e dt_saida = 0,se ouver algum numero duplicado
				//tem que mandar para outra tabela e deletar depois
				
				preparedStatement.close();
				
			}
			
		}else{
			Conexao.ReiniciarConexao();
			String sql = "INSERT INTO dth_gvt " + "(no_serie,casId,cartao,mac,denominacao,codigo_material,Vl_unitario,no_pedido,no_fiscal,dt_criacao,observacao) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
			try{				
				PreparedStatement stmt = connection.prepareStatement(sql);
				stmt.setLong(1, dados.getNo_serie());
				stmt.setLong(2, dados.getCasId());
				stmt.setLong(3, dados.getCartao());
				stmt.setString(4, dados.getMac());
				stmt.setString(5, dados.getDenominacao());
				stmt.setString(6, dados.getCodigo_material());
				stmt.setDouble(7, dados.getVl_unitario());
				stmt.setInt(8, dados.getNo_pedido());
				stmt.setInt(9, dados.getNo_fiscal());
				stmt.setString(10, dados.getDt_criacao());
				stmt.setString(11, dados.getObservacao());	
				stmt.execute();			
				stmt.close();
				
			}finally {			
				try {					
					if(preparedStatement != null){
						preparedStatement.close();
					}
					Conexao.ReiniciarConexao();
				} catch (SQLException e) {
					// LOGGING
					e.printStackTrace();
				}
			}
		}
	}
	
	//metodo para atualizar o banco apos a entrada
	public void alteraEntrada (AtributosDoBanco dados) throws SQLException{
		String Query = " SELECT no_serie FROM dth_gvt WHERE no_serie =? AND no_fiscal=? AND no_pedido=?";  
		PreparedStatement statos = connection.prepareStatement(Query);
		statos.setLong(1, dados.getNo_serie());
		statos.setInt(2, dados.getNo_fiscal());
		statos.setInt(3, dados.getNo_pedido());
		ResultSet rs = statos.executeQuery();
		if(rs.next()){
			String sql = "UPDATE dth_gvt SET casId=?,cartao=?,mac=?,observacao=?,dt_entrada=? WHERE no_serie=?";		
			try{
				PreparedStatement stmt = connection.prepareStatement(sql);
				stmt.setLong(1, dados.getCasId());
				stmt.setLong(2, dados.getCartao());
				stmt.setString(3, dados.getMac());
				stmt.setString(4, dados.getObservacao());
				stmt.setString(5, dados.getDt_entrada());
				stmt.setLong(6, dados.getNo_serie());
				stmt.execute();
				stmt.close();			
			}catch (SQLException e){
				throw new RuntimeException(e);
			}
		}else{			
			JOptionPane.showMessageDialog(null,"Por Favor Verifique o Numero de Serie e Nota Fiscal");
		}
		
	}
	
	//metodo de Pesquisa simples
	public void pesquisa(AtributosDoBanco dados){  
        String con = "SELECT no_serie, casId, cartao,mac, denominacao, no_fiscal, no_pedido, dt_entrada, observacao FROM dth_gvt WHERE no_serie=?";
        try {  
            PreparedStatement prep = connection.prepareStatement(con);  
            prep.setLong(1, dados.getNo_serie());           
            ResultSet rs = prep.executeQuery();              
            rs.next();              
            	long noSerie = rs.getLong("no_serie");
    			long casId = rs.getLong("casId");
    			long cartao = rs.getLong("cartao");
    			String mac = rs.getString("mac");
    			String denominacao = rs.getString("denominacao");
    			int notafiscal = rs.getInt("no_fiscal");
    			int pedido = rs.getInt("no_pedido");
    			String dt_entrada = rs.getString("dt_entrada");
    			String observacao = rs.getString("observacao");
    			prep.execute();
    			prep.close();
                JOptionPane.showMessageDialog(null,"N° Serie:    "+noSerie+"\n"+"N° CasId:    "+casId+"\n"+"N° Cartao:     "+cartao+"\n"+"Mac@:     "+mac+"\n"+"Denominação:    "+denominacao+"\n"+"N° Nota Fiscal:     "+notafiscal+"\n"+"N° Pedido:     "+pedido+"\n"+"Observação:     "+String.valueOf(observacao)+"\n"+"Data Entrada:   "+dt_entrada);
          }catch (SQLException e){
        	throw new RuntimeException(e);
		}
	}
	//metodo para atualizar o banco apos a saida
	public void alteraSaida (AtributosDoBanco dados) throws SQLException{
		String Query = " SELECT no_serie FROM dth_gvt WHERE no_serie =? AND saida = 'true'";  
		PreparedStatement statos = connection.prepareStatement(Query);
		statos.setLong(1, dados.getNo_serie());
		ResultSet rs = statos.executeQuery();
		if(rs.next()){
			String sql = "UPDATE dth_gvt SET dt_saida=?, observacao=?, saida='true' WHERE no_serie=?";		
			try{
				PreparedStatement stmt = connection.prepareStatement(sql);
				stmt.setLong(1, dados.getCasId());
				stmt.setLong(2, dados.getCartao());
				stmt.setLong(3, dados.getNo_serie());
				stmt.execute();
				stmt.close();			
			}catch (SQLException e){
				throw new RuntimeException(e);
			}
		}else{			
			JOptionPane.showMessageDialog(null,"Por Favor Verifique o Numero de Serie");
		}
		
	}
	
	
	
	
	
}

18 Respostas

I

O que é esse reiniciar ?
Com letra maiúscula ainda, espero que não seja um método, coloca no padrão do Java no mínimo.
Depois arruma as resposansabilidades seu código é confuso.
E outra não se fecha conexão no try

J

A Classe DriverManger tem um construtor privado, então não permite novas instancias.
private DriverManager(){}

Acho muito estranho você dizer que tem mais de 150 conexões abertas. Você se refere a isso?:

if (connection != null) {

status = (STATUS>Conectado com sucesso!);
}

Se o metodo consegue adicionar 50 registros, o problema não deve ser de conexão. Mas de qualquer forma, tente simplificar mais. Tá muito poluido o seu metodo adiciona. E se eu fosse voce, por enquanto não se preocuparia em fechar nada, nem Statement, nem ResultSet, nem conexão. So faz o adiciona simplemente, para ve no que dá.

A

Oi Jonas Valeu pela resposta. Então dei uma limpada no metodo, mas o erro problema continua, eu disse que inceria 50 ± por que era a resposta que console me da, agora almentou pra 91:

89

90

91

Nao foi possivel conectar ao Banco de Dados.

java.lang.NullPointerException

at br.dao.com.AtributosDoBancoDAO.adiciona(AtributosDoBancoDAO.java:28)

at br.extecoes.com.InsertExcel.test1(InsertExcel.java:82)

at br.janelas.com.Entrada$11.actionPerformed(Entrada.java:324)

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEventImpl(Unknown Source)

at java.awt.EventQueue.access$500(Unknown Source)

at java.awt.EventQueue$3.run(Unknown Source)

at java.awt.EventQueue$3.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue$4.run(Unknown Source)

at java.awt.EventQueue$4.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)
I

Posta a linha 28 da classe Atributos

A

PreparedStatement statos = connection.prepareStatement(Query);

A

esse é o metodo completo:

public void adiciona(AtributosDoBanco dados)throws SQLException, IOException{
String Query = " SELECT no_serie FROM dth_gvt WHERE no_serie =? AND saida = ‘false’ ";

PreparedStatement statos = connection.prepareStatement(Query);
	statos.setLong(1, dados.getNo_serie());
	ResultSet rs = statos.executeQuery();
	if(rs.next()){
		JOptionPane.showMessageDialog(null,"Este numero de serie ja Existe",Query, 1);			
	}else{
		
		String sql = "INSERT INTO dth_gvt " + "(no_serie,casId,cartao,mac,denominacao,codigo_material,Vl_unitario,no_pedido,no_fiscal,dt_criacao,observacao) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
		try{				
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, dados.getNo_serie());
			stmt.setLong(2, dados.getCasId());
			stmt.setLong(3, dados.getCartao());
			stmt.setString(4, dados.getMac());
			stmt.setString(5, dados.getDenominacao());
			stmt.setString(6, dados.getCodigo_material());
			stmt.setDouble(7, dados.getVl_unitario());
			stmt.setInt(8, dados.getNo_pedido());
			stmt.setInt(9, dados.getNo_fiscal());
			stmt.setString(10, dados.getDt_criacao());
			stmt.setString(11, dados.getObservacao());	
			stmt.execute();			
			stmt.close();
			
		} catch (SQLException e) {
				// LOGGING
				e.printStackTrace();
			}
		
	}
}
I

Olha a arquitetura do seu código, se dá EXCEPTION no método getconnection vc retorna nulo, e quando vc usa a conexão vc não verifica como está o objeto.
Não faz sentido algum.

A
Mano, ve se ainda ta sem sentido

public void adiciona(AtributosDoBanco dados)throws SQLException{

String Query = " SELECT no_serie FROM dth_gvt WHERE no_serie =? AND saida = ‘false’ ";
PreparedStatement statos = connection.prepareStatement(Query);
	statos.setLong(1, dados.getNo_serie());
	ResultSet rs = statos.executeQuery();
	if(rs.next()){
		JOptionPane.showMessageDialog(null,"Este numero de serie ja Existe",Query, 1);
		if(preparedStatement != null){
			preparedStatement.close();
			
		}
		connection.close();
	}else{
		String sql = "INSERT INTO dth_gvt " + "(no_serie,casId,cartao,mac,denominacao,codigo_material,Vl_unitario,no_pedido,no_fiscal,dt_criacao,observacao) VALUES (?,?,?,?,?,?,?,?,?,?,?)";
		try{				
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, dados.getNo_serie());
			stmt.setLong(2, dados.getCasId());
			stmt.setLong(3, dados.getCartao());
			stmt.setString(4, dados.getMac());
			stmt.setString(5, dados.getDenominacao());
			stmt.setString(6, dados.getCodigo_material());
			stmt.setDouble(7, dados.getVl_unitario());
			stmt.setInt(8, dados.getNo_pedido());
			stmt.setInt(9, dados.getNo_fiscal());
			stmt.setString(10, dados.getDt_criacao());
			stmt.setString(11, dados.getObservacao());	
			stmt.execute();			
			stmt.close();
			
		} catch (SQLException e) {
				// LOGGING
				e.printStackTrace();
			}finally {				
				connection.close();}
		}
	}
J

O que faz imprimir esses numeros? Imprime antes ou depois da conexão feita?
Parece que você usa isso aqui if(rs.next()){} sem estar com a conexão aberta

J

Agora você adicionou um connection.close() no metodo rsrsr

A

é so um system que eu adicionei no metodo que lê a tabela do excel, so pra ver ser o estava percorrendo as linhas

J

Ok, mas nesse momento ainda não foi feita conexao com o banco. Vou te passar uma Classe de conexao aqui, aí voce tenta essa

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.*;

import javax.swing.JOptionPane;

public class Conexao {
public static PreparedStatement stm = null; //responsavel por preparar e realizar pesquisas no banco de dados
public static ResultSet rs = null; //responsavel por armazenar o resultado de uma pesquisa
public static Connection conn = null; //responsavel por realizar a conexao com o banco de dados

private static final String DRIVER  = "com.mysql.jdbc.Driver"; // responsavel por identificar o serviço de banco de dados
private static final String URL = "jdbc:mysql://localhost:3306/seuBanco"; //responsavel por setar o local do banco de dados
private static final String USUARIO = "root"; 
private static final String SENHA = "";

public static boolean conectado = false;
//metodo que realiza a conexao
public static void getConexao() { 
    try {
        System.setProperty("jdbc.Drivers", DRIVER); //seta a propriedade de driver de conexao 
        conn = DriverManager.getConnection(URL,USUARIO,SENHA); 
        conectado = true;
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null,"Conecte-se ao banco de dados primeiro!");
    }
}

public static void fechaConexao(Connection conn, PreparedStatement stm, ResultSet rs) {
    try {
        if (conn != null) {
            conn.close();
        }
        if (stm != null) {
            stm.close();
        }
        if (rs != null) {
            rs.close();
        }
        conectado = false;
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null,"Não foi possivel fechar a conexao! Erro "+ex.getMessage());
    }
}

}

Coloque para imprimir esse conectado ao tentar abrir a conexao

Porque tambem não vi a mensagem Conectado com sucesso aí da sua Classe

C

Olá,

Você precisa rever seus conceitos de programação orientada a objetos .

São tantos códigos errados.

Você deveria uma conexão na inicialização do objeto, reutilizar várias vezes, e na finalização do objeto você fecha.

O código abaixo você está criando e em seguida fechando uma conexão, cada vez uma conexão diferente:

//Método que fecha sua conexão//
  public static boolean FecharConexao() {
      try {
          Conexao.getConexao().close();
          return true;
      } catch (SQLException e) {
          return false;
      }
  }

A primeira linha do código abaixo não faz sentido:

public AtributosDoBancoDAO(){
		new Conexao();
		this.connection = Conexao.getConexao();
		
	}

Tem mais.

Só refazendo…

É fácil achar um código DAO com JDBC usando a pesquisa do Google.

A

Oi, então eu achei varios exemplos e testei varias tambem, a ultima que fiquei foi essa, mas a original do meu projeto era bem simplese me dava o mesmo erro de conoxão

C

Olá,

Veja: https://www.caelum.com.br/apostila-java-web/bancos-de-dados-e-jdbc/#2-4-fabrica-de-conexoes

A

kkk foi exatamente essa a primeira class de conexao que eu usei, eu tenho essa apostila

C

Olá,

Infelizmente, está fazendo muito mal uso do conhecimento.

A

bom galera pra não ficar tomando o tempo de vcs eu vou refazer a class de conexão, limpar todo meu codigo, seguir as dicas que vs me deram e fazer o bom uso do conhecimento, depois disso eu vou postar aqui se eu consegui resolver. Obrigado pelas dicas boa noite.

Criado 14 de junho de 2016
Ultima resposta 15 de jun. de 2016
Respostas 18
Participantes 4