几次调用后,Session.get()的调用挂起

时间:2013-12-07 21:51:34

标签: java mysql hibernate

我想在一次调用中使用Hibernates Session保存很多实体,所以我创建了这段代码:

public void persistOrUpdateAllTrades(List<Trade> objects) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
Session session = (Session)entityManager.getDelegate();

try {
    FlushMode lastFlushMode = session.getFlushMode();
    session.setFlushMode(FlushMode.MANUAL);

    for(Trade trade: objects) {
        if(session.get(Trade.class, trade.getId()) == null){
            session.save((Object)trade);
        }
    }

    session.flush();
    session.setFlushMode(lastFlushMode);

} catch (Throwable e) {
    throw new RuntimeException(e.getMessage(),e);
}

}

它通常运行良好,但有时执行会在if(session.get(Trade.class, trade.getId()) == null)停止/挂起,我不明白为什么。它不会抛出任何异常,应用程序也不会停止。应用程序使用在localhost上运行的MySQL服务器。任何提示?

1 个答案:

答案 0 :(得分:1)

您没有关闭EntityManager。这是泄漏资源,通常是来自连接池的连接。最终,池没有更多可用的连接,因此它只会阻塞,直到它获得可用的连接(在您的情况下永远不会)。快速解决方法只是在方法的底部执行entityManager.close()