2013-12-07 118 views
0

我想保存使用Hibernate的会话许多实体在一个电话挂了,所以我创造了这个代码:呼叫Session.get()后,多次打电话

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

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

+0

这就是它,谢谢! –