2012-11-27 99 views
2

我正在調查我的代碼中的連接泄漏。我們使用C3P0來管理連接池和我一般的Hibernate使用模式是這樣的:正確關閉休眠事務

EntityManager entityManager = entityManagerFactory.createEntityManager(); 

try { 

    EntityTransaction transaction = entityManager.getTransaction(); 
    transaction.begin(); 

    //..Work involving calls to find() and merge() 

    transaction.commit(); 

} catch (... e) { 
    //..log message, throw nicer exceptions 

} finally { 
    entityManager.close(); 
} 

這段代碼是否有泄漏DB連接的潛力?我是否必須在出現故障的情況下顯式回滾事務,或者是否自動完成? entityManager.close()確保數據庫連接返回到連接池嗎?

回答

3

在所有catch塊中使用transaction.rollback()。 該交易將被關閉而無需提交然後

+0

有沒有辦法做自動回滾?這將是一個更好的解決辦法,比強迫我抓住所有異常情況並明確回滾。 – Oleksi

+0

回滾自動執行RuntimeExceptions。看看這個http://static.springsource.org/spring/docs/3.0.1.RELEASE/reference/html/orm.html#orm-hibernate-tx-claclarative – Mirco

+0

有用的信息。我們可以做些什麼來自動回滾某些檢查的異常? – Oleksi