c3p0表示-“;java.lang.Exception:仅调试:过期资源签出堆栈跟踪”;在启动hibernate事务时

c3p0表示-“;java.lang.Exception:仅调试:过期资源签出堆栈跟踪”;在启动hibernate事务时,java,mysql,hibernate,transactions,c3p0,Java,Mysql,Hibernate,Transactions,C3p0,最近,我的雄猫开始挂断电话。这些要求从未得到答复。我发现这是由于连接从未返回到连接池 我在hibernate中使用了c3p0,数据库是mysql 5.5 为了调试连接泄漏,我在我的hibernate.cfg.xml <property name="hibernate.c3p0.unreturnedConnectionTimeout">30</property> <property name="hibernate.c3p0.debugUnreturn

最近,我的雄猫开始挂断电话。这些要求从未得到答复。我发现这是由于连接从未返回到连接池

我在hibernate中使用了c3p0,数据库是mysql 5.5

为了调试连接泄漏,我在我的
hibernate.cfg.xml

 <property name="hibernate.c3p0.unreturnedConnectionTimeout">30</property>
        <property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</property>
指向dao.DAOBasicInfo.getBean上的
(DAOBasicInfo.java:69)

我反复核对并

由于上述错误,我有未返回的连接,然后它们堆积起来,使应用程序没有响应


请让我知道启动事务时出现了什么问题,即使我正在使用finally,也不会引发异常。

一些调试建议

  • 正如史蒂夫在评论中提到的。尝试查看删除unreturnedConnectionTimeout选项时发生的情况

  • 可能是您的查询时间过长。尝试在您的代码上记录一些性能统计信息,并查看您的查询花费了多少时间。可能您需要调整查询。在短期内,您还可以将unreturnedConnectionTimeout增加到超过查询的响应时间

  • 还可以尝试hibernate中的事务超时选项。可以设置tx.setTimeout(20)并播放超时数字,查看一些查询是否超时

  • 您可能还需要使用一些分析工具。如果您的Java版本受支持,请尝试。否则(如果在linux或mac上),您可能希望在旧版本的java上进行尝试。其中一些命令也可以从JDK获得

代码上的小改进

  • 不确定它是否真的能解决您的问题,但您可能希望在异常块中为事务添加回滚。为tx.close添加了另一个try-catch以避免另一个异常

  • 还为会话关闭添加了空检查。您可能已经知道,如果在finally块中抛出另一个异常,那么finally时的一个条件可能不会完全执行。目前,它可能不适用于您的代码,但若您在finally块中添加了多行,请确保覆盖了任何异常,以便可以执行下一行

  • 还有一个建议是缩小交易本身的范围。查看代码,似乎只有在找不到uid的情况下才需要事务。将事务代码限制在if(u==null)块中如何。不确定是否有帮助,但您不需要读取事务

下面是我的示例代码

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

出现此错误的原因之一是您没有确保

commit()


不是这个问题的答案,但是忘记提交的人在谷歌搜索错误后也会出现在这个页面上。因此,不寻常的是,在未返回连接的代码中没有明显的连接泄漏。您的应用程序是否直接挂在这个代码块内?可以尝试将unreturnedConnectionTimeout设置回零,并在挂起期间让JVM转储堆栈跟踪。如果是连接泄漏,您将看到客户端线程在c3p0的waitAvailable()中等待。但是,您可能会看到,您的线程挂起在此代码中的某个位置,这将为您提供有关需要修复的内容的线索。谢谢@SteveWaldman-我添加了回滚,这似乎适用于此项工作。我很高兴它有所帮助。:)
public static Basicinfo getBean(Integer iduser) {
        Basicinfo u = null;
        Session sess = NewHibernateUtil.getSessionFactory().openSession();
        try {
            Transaction tx = sess.beginTransaction();   //line 69
            Query q = sess.createQuery("from Basicinfo where iduser=" + iduser);
            u = (Basicinfo) q.uniqueResult();
            if (u == null) {
                u = new Basicinfo();
                u.setIduser(iduser);
            }
            tx.commit();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            sess.close();
        }
        return u;
    }
    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;
}