我有以下的使用情况下,我接收通过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