【发布时间】:2011-04-05 19:26:49
【问题描述】:
我有以下用例,我通过 JMS 通过实体的唯一属性(不是 PK)接收有关实体的消息,它要求我更新实体的状态:
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();
}
在这个用例中,我必须为我尝试更新的实体尚未创建这一事实做好准备,因此我要求创建这样的实体(它的模板要精确地具有唯一属性) 然后我改变它。 我的困境如下: 一方面,我有两个明显不同的块,我应该在适当的情况下使用不同的 catch 子句,但将其视为最终情况,即我查询时实体不存在,但稍后我尝试创建它时是否存在(因此 ConstraintViolationException ) 是不应该经常发生的事情,并且插入因为中间的额外提交/开始事务看起来很紧凑。
我主要关心的是在提交/开始时完成的会话同步和 JDBC 连接对性能的额外影响。
我错了吗?我是否在不应该的地方寻找优化?我错过了什么吗?
提前致谢
【问题讨论】:
标签: java performance hibernate transactions