2013-12-07 151 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

這就是它,謝謝! –