Olá pessoal,
alguém já teve algum problema
com seguinte Erro: Too many connections?
Deu esse problema no seguinte trecho de código:
//Cada construtor abre uma conexão diferenteProdutorDaoprodutorDao=newProdutorDao();TecnicoDaotecnicoDao=newTecnicoDao();AmostraDaoamostraDao=newAmostraDao();Calendarcal1=Calendar.getInstance();Stringdata=cal1.get(Calendar.YEAR)+"/"+cal1.get(Calendar.MONTH)+"/"+cal1.get(Calendar.DATE);Calendarcal2=Calendar.getInstance();Stringhorario=cal2.get(Calendar.HOUR_OF_DAY)+":"+cal2.get(Calendar.MINUTE)+":"+cal2.get(Calendar.SECOND);SolicitacaoServicosolicitacao;//Amarrar o construtor ao Sistemasolicitacao=newSolicitacaoServico(1,produtorDao.procurarProdutor(3),tecnicoDao.procurarTecnico(4),"solicitacao89",data,horario,3,amostraDao.procurarAmostrasPorProtocolo(1));SolicitacaoServicoDaosolicitacaoDao=newSolicitacaoServicoDao();solicitacaoDao.salvarSolicitacaoServico(solicitacao);System.out.println("Solicitação Cadastrada com Sucesso!");
Alguns amigos me disseram para eu implementar inversão de controle,
mas como eu faço inversão de controle no DAO?
publicclassTecnicoDao{privateConnectionconn=null;privateStatementstmt=null;//O.K.!!!publicTecnicoDao()throwsLAFQADaoException{try{this.conn=ConnectionFactory.getConnection();}catch(Exceptione){thrownewLAFQADaoException("erro"+":\n"+e.getMessage());}}//O.K.!!!publicvoidsalvarTecnico(Tecnicotecnico)throwsLAFQADaoException{PreparedStatementps=null;if(tecnico==null)thrownewLAFQADaoException("O valor passado não pode ser lido");try{Stringsql="INSERT INTO tecnico(idUsuario, nome, "+"telefone, celular, email)"+"VALUES(?,?,?,?,?)";/* Cria o Statement a partir da conexão (conn) * passando a consulta sql como parâmetro. */ps=conn.prepareStatement(sql);/* Seta as variáveis *//* Com uma instância de UsuárioDao eu salvo o usuario do tecnico, pegando o usuario do tecnico que veio do parâmetro. O método salvarUsuarioSistema além de salvar o usuario no banco já retorna a chave primária (AUTOINCREMENT) para o ps.setInt setar o valor do idUsuario da tabela tecnico. */ps.setInt(1,(newUsuarioSistemaDao()).salvarUsuarioSistema(tecnico.getUsuario()));ps.setString(2,tecnico.getNome());ps.setString(3,tecnico.getTelefone());ps.setString(4,tecnico.getCelular());ps.setString(5,tecnico.getEmail());ps.executeUpdate();}catch(Exceptionsqle){thrownewLAFQADaoException("Erro ao inserir dados\n"+sqle);}finally{try{/* Fecha as Conexões e os PreparedStatement */ConnectionFactory.closeconnection(conn,ps);}catch(SQLExceptionex){Logger.getLogger(TecnicoDao.class.getName()).log(Level.SEVERE,null,ex);}}}
Será que alguém pode me dar uma ajuda?
[]'s.
mynameisflaw
Rapaz, pelo foi o banco de dados que retornou esse erro, e não a aplicacao.
3 maneiras simples de resolver:
utilize pooling de conexoes
aumente o numero limite de conexoes do banco
gerencie as conexoes, abrindo e fechando
dê preferencia ao pooling, para seu container gerenciar automaticamente
kicolobo
mynameisflaw:
Rapaz, pelo foi o banco de dados que retornou esse erro, e não a aplicacao.
3 maneiras simples de resolver:
utilize pooling de conexoes
aumente o numero limite de conexoes do banco
gerencie as conexoes, abrindo e fechando
dê preferencia ao pooling, para seu container gerenciar automaticamente
Incrementando a resposta:
Diminua o tempo de standby das conexões na sua configuração do SGBD. É muito comum encontrarmos servidores configurados para que as conexões inativas durem algo como 8, 16, 24 horas. Normalmente as pessoas fazem isto para evitar o erro de se ter uma conexão fechada pelo SGBD (ou seja, POG extreme)
ricardocomp
Jóia pessoal?
eu já estou tentando resolver gerenciando as conexoes, abrindo e fechando
passando a conexão para o construtor do DAO aí eu estava pensando em
abrir a conexão quando alguém for usar o DAO e passar a conexão para o
construtor, aí o DAO faz o que tem q fazer e depois eu fecharia a conexão.
até aí tudo bem, o problema é o PreparedStatement e o ResultSet quem
deve ficar responsavél por fechar essa galera? eu continuo usando o bloco
finally normalmente?