首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate线程安全集合

Hibernate线程安全集合
EN

Stack Overflow用户
提问于 2013-11-25 22:39:33
回答 1查看 775关注 0票数 3

这在某种程度上是Hibernate session thread safety的延续。所有的细节也适用于这里。简单地说,执行遵循以下模式:

代码语言:javascript
复制
1. Read entity
2. Do expensive, easily parallelizable work
3. Persist changes

所有实体都配置为急切加载,并且会话在2期间根本不被访问。

2所涉及的工作不需要对持久集合进行频繁的修改。这就是我现在拥有的:

代码语言:javascript
复制
synchronized (parentEntity) {
    parentEntity.getChildEntities().add(childEntity);
}

这是很好的工作,但我试图“白痴-防止”这个系统,我正在寻找一种方法,以移动到持久层尽可能远的并发控制。我在刀上试过这个:

代码语言:javascript
复制
@Transactional
public ParentEntity getParentEntityById(long id) {
    ParentEntity parent = ...;
    parent.setChildren(Collections.synchronizedSet(parent.getChildren()));
    return parent;
}

这导致了org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance...

有没有人可以将线程安全引入hibernate集合,或者以不需要污染业务逻辑的方式控制并发访问和修改?

Update- -按照佩斯的建议,这里是我最后做的事情:

代码语言:javascript
复制
@Transactional
public ParentEntity getParentEntityById(long id) {
    ParentEntity parent = ...;
    currentSession().evict(parent);
    parent.setChildren(Collections.synchronizedSet(parent.getChildren()));
    return parent;
}

工作完成后,我保存所有的孩子并调用currentSession().merge(parent)。就像一种魅力!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-26 02:54:14

  1. 读取实体
  2. 分离实体
  3. 做昂贵的,容易并行的工作
  4. 合并实体
  5. 提交事务

如果第三步花费大量时间,那么我建议简单地:

  1. 打开会话(可以是只读的)
  2. 阅读实体(Ies)
  3. 关闭会话
  4. 做昂贵的,容易并行的工作
  5. 打开一个新的会话
  6. 合并实体
  7. 关闭会话

当分离/未附加时,您应该能够将集合包装在线程安全集合中。合并不应该关心您拥有的集合实现。不过,我还没有测试过它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20204897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档