sql >> Base de Datos >  >> RDS >> Mysql

c3p0 dice - java.lang.Exception:SOLO DEPURACIÓN:Rastreo de pila de verificación de recursos vencidos al iniciar una transacción de hibernación

Algunas sugerencias para depurarlo

  • Como Steve mencionó en los comentarios. Intente ver qué sucede cuando elimina la opción ConnectionTimeout no devuelta.

  • Puede ser que sus consultas estén tardando demasiado. Intente registrar algunas estadísticas de rendimiento en su código y vea cuánto tiempo está tomando su consulta. Puede ser que necesite ajustar su consulta. y, a corto plazo, también puede aumentar el tiempo de espera de conexión no devuelto para que sea más que el tiempo de respuesta en sus consultas.

  • Pruebe también la opción de tiempo de espera de transacción en hibernación. Se puede establecer tx.setTimeout(20) y jugar con los números de tiempo de espera y ver si algunas consultas se agotan.

  • También es posible que desee utilizar alguna herramienta de creación de perfiles. Prueba VisualVM en caso de que su versión de Java sea compatible con él. De lo contrario (si está en Linux o Mac), puede probar Comandos de depuración de Java en una versión anterior de Java. Algunos de esos comandos también están disponibles en JDK.

Pequeñas mejoras en el código

  • No estoy seguro de si realmente solucionará su problema; sin embargo, es posible que desee agregar una reversión para la transacción en el bloque de excepción. Se agregó otra captura de prueba para tx.close para evitar otra excepción.

  • También se agregó una verificación nula para el cierre de la sesión. Es posible que ya sepa que una condición cuando finalmente puede no ejecutarse por completo, si se lanza otra excepción en el bloque finalmente. Actualmente, es posible que no sea aplicable en su código; sin embargo, en caso de que agregue más de una línea en el bloque final, asegúrese de que se cubran las excepciones para que se pueda ejecutar la siguiente línea.

  • Una sugerencia más es reducir el alcance de la transacción en sí. Mirando el código, parece que puede necesitar la transacción solo en caso de que no se encuentre un uid. ¿Qué hay de limitar el código de transacción dentro del bloque if(u==null)? No estoy seguro si ayuda, pero no necesita tener una transacción para leer.

A continuación se muestra mi código de muestra

    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;
}