Hibernate 4:避免加载大集合来添加元素 - 第二级缓存一致性

时间:2018-01-19 15:52:29

标签: hibernate ehcache infinispan

在添加或删除属于另一个实体上的一对多集合(集合)的实体时,我正在努力解决性能问题。

我有适当的多对一反对关系集。

让我告诉你一些代码。这是Child实体:

@Entity
@Access(AccessType.FIELD)
@Table(name = "child")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@BatchSize(size = 20)
public class Child {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "dbid", unique = true, nullable = false)
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent1_id", nullable = true)
    private Parent1 parent1;

    /** Some other attributes, getters / setters **/
}

以下是Parent1类:

@Entity
@DynamicUpdate(true)
@Access(AccessType.FIELD)
@Table(name = "parent1")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@BatchSize(size = 20)
public class Parent1 {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "dbid", unique = true, nullable = false)
    private Integer id;

    @OneToMany(mappedBy = "parent1", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @BatchSize(size = 10)
    private Set<Child> children = new HashSet<Child>();

    /** Some other attributes, getters / setters **/
}

我目前正在使用EHCache。

目前,当我们创建属于Child的{​​{1}}时,我们通过设置{{1}的Parent1属性来维护(根据需要)关系的双方并将子项添加到parent1集合。

这会导致整个Child集合的获取,这是我们的性能瓶颈:

  • 它可能包含数百个数千个实体
  • 当我们向其添加实体时,它会使缓存无效,因此当我们反复执行此操作时(想想客户端逐个添加数百个子节点),每次添加都会重新获取集合

我的表现问题与this question非常相似,我认为接受的答案符合我的要求。通过一些改编(如何将集合从Hibernate 3改为4),至少在性能方面,它的效果非常好。

我仍然希望确保它不会弄乱二级缓存或其他任何,请记住,所做的只是内部交易

我们捕获由children缓存策略(陈旧状态或陈旧对象异常,我猜这些是第一级缓存错误?)引起的潜在缓存错误,并在它们发生时执行回滚(这是当前预期的行为我们的应用程序),它似乎没有比第一级更破坏缓存。

在不久的将来,我们希望使用Infinispan进行完全事务处理(因此我们必须使用children缓存并发策略)。

也就是说,正式地说,我的问题是:如果不收集具有这些约束的缓存中的集合,我怎么能在READ_WRITE的{​​{1}}集合中添加/删除子集而不加载集合:< / p>

  • 使用EHCache:导致一次性(罕见)错误并不是一个问题,除了正确的回滚之外没有其他后果,但它绝不能真正破坏缓存,或者破坏事务保证。
  • 理想情况下,我希望解决方案可以使用我们使用的任何缓存(例如Infinispan)

当然,我想知道为什么任何解决方案(来自上面的链接?)会带来这样的保证。

如果某些注释不是真的相关,请不要责怪我(如果是这样的话,请不要犹豫;)),这是我正在研究的遗留代码,我还在学习。也许我没有真正理解所有概念,如果需要,我会快速编辑我的问题。

0 个答案:

没有答案