Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

c3p0 diz - java.lang.Exception:DEBUG ONLY:rastreamento de pilha de check-out de recurso vencido ao iniciar uma transação de hibernação


Algumas sugestões para depurá-lo

  • Como Steve mencionou nos comentários. Tente ver o que acontece quando você remove a opção unreturnedConnectionTimeout.

  • Pode ser que suas consultas estejam demorando muito. Tente registrar algumas estatísticas de desempenho em seu código e veja quanto tempo sua consulta está demorando. Pode ser que você precise ajustar sua consulta. e para curto prazo você também pode aumentar o unreturnedConnectionTimeout para ser mais do que o tempo de resposta em suas consultas.

  • Tente também a opção de tempo limite de transação em hibernação. Pode ser definido tx.setTimeout(20) e brincar com os números de tempo limite e ver se algumas consultas expiram.

  • Você também pode querer usar alguma ferramenta de criação de perfil. Experimente o VisualVM caso sua versão do Java seja suportada nele. Caso contrário (se no linux ou mac) você pode tentar Comandos de depuração Java na versão mais antiga do java. Alguns desses comandos também estão disponíveis no JDK.

Pequenas melhorias no código

  • Não tenho certeza se isso realmente resolverá seu problema, mas você pode querer adicionar rollback para transação no bloco de exceção. Adicionado outro try catch para tx.close para evitar outra exceção.

  • Também foi adicionada uma verificação nula para o fechamento da sessão. Você já deve saber que uma condição quando finally pode não ser executada completamente - se outra exceção for lançada no bloco finally. Atualmente, pode não ser aplicável em seu código, no entanto, caso você adicione mais de uma linha no bloco finally, certifique-se de que todas as exceções sejam cobertas para que a próxima linha possa ser executada.

  • Mais uma sugestão é reduzir o escopo da própria transação. Olhando para o código, parece que você pode precisar da transação apenas caso um uid não seja encontrado. Que tal limitar o código de transação dentro do bloco if(u==null). Não tenho certeza se ajuda, mas você não precisa ter transação para leitura.

Abaixo está meu código de exemplo
    public static Basicinfo getBean(Integer iduser) {
    Basicinfo u = null;
    Transaction tx = null;
    Session sess = NewHibernateUtil.getSessionFactory().openSession();
    try {

        Query q = sess.createQuery("from Basicinfo where iduser=" + iduser);
        u = (Basicinfo) q.uniqueResult();
        if (u == null) {
            tx = sess.beginTransaction();   //line 69
            u = new Basicinfo();
            u.setIduser(iduser);
            tx.commit();
        }           
    } catch (Exception ex) {
        ex.printStackTrace();
        if(tx != null) {
            try {
             tx.rollback();
            } catch(Exception e){e.printStackTrace;}
        }
    } finally {
        if(sess!=null) {
         sess.close();
        }
    }
    return u;
}