我有以下的使用情況下,我接收通過JMS消息有關的實體,通過它(不PK)的唯一性,它要求我更新的實體的狀態:提交hibernate事務有多昂貴?
HibernateUtil.beginSession();
HibernateUtil.beginTransaction();
try{
Entity entity = dao.getEntityByUniqueProperty(propertyValue);
if (entity==null){
entity = dao.addEntityByUniqueProperty(propertyValue)
}
entity.setSomeProperty(otherPropertyValue);
HibernateUtil.commitTransaction();
} catch (ConstraintViolationException e){
HibernateUtil.rollbackTransaction();
//Do other things additionally
} catch (StaleStateObjectException e){
HibernateUtil.rollbackTransaction();
//Do other things additionally
} finally {
HibernateUtil.closeSession();
}
在這個用例中,我必須準備好以下事實,即我嘗試更新的實體尚未創建,因此我要求創建此實體(它的模板與獨特屬性精確一致),並且然後我改變它。 我的dillema如下: 一方面我有兩個明顯不同的塊,我應該在適當的地方使用不同的catch子句,但是看到最後一種情況,當我查詢時實體不在那裏,但是在稍後有ms時我嘗試創建它(因此ConstraintViolationException)是不應該經常發生並插入的,因爲在中間的額外提交/ beginTransaction看起來似乎很糟糕。
我主要關心會話同步和JDBC連接在執行/開始時發生的額外性能影響。
我錯了嗎?我在哪裏找不到優化?我錯過了什麼嗎?
在此先感謝
我不會建議,最好的做法是總是有一個交易,即使是選擇,見亞倫的答案。另外你會發現JDBC驅動程序可能會發出一個事務調用。老實說,除非你試圖做數百秒,這不可能是一個問題。我將編輯我的答案,我將如何解決這個問題。 – 2010-08-30 17:26:05
@Mike這是不正確的,不使用事務進行只讀查詢是非常好的。 – 2010-08-30 19:14:17