gpt4 book ai didi

java - 提交 hibernate 事务有多昂贵?

转载 作者:行者123 更新时间:2023-11-29 06:46:51 25 4
gpt4 key购买 nike

我有以下用例,我通过 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();
}

在这个用例中,我必须为我要更新的实体尚未创建这一事实做好准备,因此我请求创建这样的实体(它的模板准确地具有唯一属性) 然后我改变它。我的困境如下:一方面,我有两个明显不同的 block ,我应该在适当的地方使用不同的 catch 子句,但将其视为最终情况,即当我查询时实体不存在,但稍后当我尝试创建它时实体存在(因此 ConstraintViolationException ) 是不应该经常发生并且插入的事情,因为中间的额外 commit/beginTransaction 看起来很笨重。

我主要担心在提交/开始时完成的 session 同步和 JDBC 连接的额外性能影响。
我错了吗?我是否正在寻找不应该进行的优化?我错过了什么吗?
提前致谢

最佳答案

首先,您需要一笔交易。没有它,上面的代码将无法工作,因为这可能会发生:

  • 线程 1 创建了唯一实例
  • 线程 2 获得唯一实例
  • 线程 2 设置其他属性
  • 线程 1 设置其他属性
  • 线程 1 刷新缓存
  • 线程 2 刷新缓存

问题:在这种情况下数据库是否一致?在类似情况下会(不)一致吗?

始终使用交易。数据库针对它进行了优化。如果遇到问题,请开始考虑您的设计。就像您必须每秒处理数千条消息一样,并且您的性能工具显示此代码已成为瓶颈。不要相信你的直觉。

关于java - 提交 hibernate 事务有多昂贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3601412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com