Too many connections

4 respostas
ricardocomp

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 diferente
            ProdutorDao produtorDao = new ProdutorDao();
            TecnicoDao tecnicoDao = new TecnicoDao();
            AmostraDao amostraDao = new AmostraDao();

            Calendar cal1 = Calendar.getInstance();
            String data = cal1.get(Calendar.YEAR) + "/" + cal1.get(Calendar.MONTH) + "/" + cal1.get(Calendar.DATE);

            Calendar cal2 = Calendar.getInstance();
            String horario = cal2.get(Calendar.HOUR_OF_DAY) + ":" + cal2.get(Calendar.MINUTE) + ":" + cal2.get(Calendar.SECOND);

            SolicitacaoServico solicitacao;
            //Amarrar o construtor ao Sistema
            solicitacao = new SolicitacaoServico(1, produtorDao.procurarProdutor(3), tecnicoDao.procurarTecnico(4), "solicitacao89", data, horario, 3, amostraDao.procurarAmostrasPorProtocolo(1));
                       
            SolicitacaoServicoDao solicitacaoDao = new SolicitacaoServicoDao();
            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?

Será que alguém poderia me dar uma ajdua?

[]'s.

4 Respostas

ricardocomp

Uma parte do meu DAO que já está funcionando:

public class TecnicoDao {
    
    private Connection conn = null;
    private Statement stmt = null;
    
    //O.K.!!!
    public TecnicoDao() throws LAFQADaoException {
        try {
            this.conn = ConnectionFactory.getConnection();
        }
        catch (Exception e) {
            throw new LAFQADaoException("erro" + ":\n" + e.getMessage());
        }
    }
    
    //O.K.!!!
    public void salvarTecnico(Tecnico tecnico) throws LAFQADaoException {

        PreparedStatement ps = null;        

        if (tecnico == null)
            throw new LAFQADaoException("O valor passado não pode ser lido");

        try {           

            String sql = "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, (new UsuarioSistemaDao()).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 (Exception sqle) {
            throw new LAFQADaoException("Erro ao inserir dados\n" + sqle);
        }
        finally {
            try {
                /* Fecha as Conexões e os PreparedStatement */
                ConnectionFactory.closeconnection(conn, ps);
            }
            catch (SQLException ex) {
                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?

[]'s.

Criado 8 de janeiro de 2010
Ultima resposta 8 de jan. de 2010
Respostas 4
Participantes 3