2013-11-25 93 views
3

这是Hibernate session thread safety的延续。所有的细节也适用于这里。在简化的计算,执行如下的图案:休眠线程安全集合

1. Read entity 
2. Do expensive, easily parallelizable work 
3. Persist changes 

的实体被全部配置为急切装载,并且会话期间不2.

参与2工作需要不频繁的修改在所有被访问一个持久的集合。这是我现在有:

synchronized (parentEntity) { 
    parentEntity.getChildEntities().add(childEntity); 
} 

这只是正常的,但我想“傻瓜型”这一制度,我正在寻找一种方式来尽可能下移并发控制入我可以持久层。我在DAO尝试这样做:

@Transactional 
public ParentEntity getParentEntityById(long id) { 
    ParentEntity parent = ...; 
    parent.setChildren(Collections.synchronizedSet(parent.getChildren())); 
    return parent; 
} 

导致​​

是否有人有办法引进线程安全冬眠的集合,或者控制并发访问和修改一些其他的清洁方式一种不需要污染业务逻辑的方法?

更新 - 这是我落得这样做,每佩斯的建议:工作完成

@Transactional 
public ParentEntity getParentEntityById(long id) { 
    ParentEntity parent = ...; 
    currentSession().evict(parent); 
    parent.setChildren(Collections.synchronizedSet(parent.getChildren())); 
    return parent; 
} 

后,我省所有的孩子和呼叫currentSession().merge(parent)。奇迹般有效!

回答

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

如果第3步采取的任何显著量那么我会推荐:

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

虽然分离/独立的你应该能够将线程安全集合中的集合打包。合并不应该关心你有什么样的集合实现。但是我没有测试过它。