我想在一次调用中使用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服务器。任何提示?
答案 0 :(得分:1)
您没有关闭EntityManager。这是泄漏资源,通常是来自连接池的连接。最终,池没有更多可用的连接,因此它只会阻塞,直到它获得可用的连接(在您的情况下永远不会)。快速解决方法只是在方法的底部执行entityManager.close()
。