gpt4 book ai didi

java - c3p0 说 - "java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace"开始 hibernate 事务

转载 作者:可可西里 更新时间:2023-11-01 07:27:44 27 4
gpt4 key购买 nike

最近,我的tomcat开始挂了。这些请求从未得到答复。我发现这是因为连接从未返回到连接池。

我用过带hibernate的c3p0,数据库是mysql 5.5

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

中添加了以下属性
 <property name="hibernate.c3p0.unreturnedConnectionTimeout">30</property>
<property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</property>

添加它们后,在日志中显示:

[2013-10-12 23:40:22.487] [ INFO] BasicResourcePool.removeResource:1392 - A checked-out resource is overdue, and will be destroyed: com.mchange.v2.c3p0.impl.NewPooledConnection@1f0c0dd
[2013-10-12 23:40:22.487] [ INFO] BasicResourcePool.removeResource:1395 - Logging the stack trace by which the overdue resource was checked-out.
java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace.

指向在dao.DAOBasicInfo.getBean(DAOBasicInfo.java:69)

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

我交叉检查并Mysql says it supports transactions with InnoDB

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

请让我知道开始交易时出了什么问题,即使我正在使用 finally 也没有抛出异常。

最佳答案

调试的一些建议

  • 正如史蒂夫在评论中提到的那样。尝试查看删除 unreturnedConnectionTimeout 选项时会发生什么。

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

  • 也可以尝试 hibernate 中的事务超时选项。可以设置 tx.setTimeout(20) 并使用超时数字来查看某些查询是否超时。

  • 您可能还想使用一些分析工具。尝试 VisualVM如果它支持您的 Java 版本。否则(如果在 linux 或 mac 上)你可能想尝试 Java Debugging commands在旧版本的 java 上。 JDK 也提供了其中一些命令。

代码的小改进

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

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

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

下面是我的示例代码

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

关于java - c3p0 说 - "java.lang.Exception: DEBUG ONLY: Overdue resource check-out stack trace"开始 hibernate 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19337638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com