【问题标题】:Hibernate lazy loading and HazelcastHibernate 延迟加载和 Hazelcast
【发布时间】:2011-07-25 09:22:45
【问题描述】:

我们现在将 Hazelcast 用作 Hibernate 2 级缓存有一段时间了,但我们发现在使用多个节点时存储和读取数据的延迟很长。

我们大量使用组合对象和@OneToMany 关系,为了提高性能,我们决定通过 Hibernate 延迟加载来加载这些组合对象或集合。正如 Hazelcast 文档中所述,我们还实现了 DataSerializable 以加速 Hazelcast 序列化。但是记录 writeData/readData 方法的使用向我们表明,它们实际上并没有被使用!

我们现在还不清楚,如果 Hibernate 代理(通过延迟加载使用)阻止使用 DataSerializable 方法(因为代理本身可能(?)不实现接口),更重要的是 - 如果 Hazelcast完全支持延迟加载 - 以及如何支持!

【问题讨论】:

    标签: hibernate caching lazy-loading second-level-cache hazelcast


    【解决方案1】:

    Hazelcast 的 DataSerializable 对 Hibernate L2 缓存没有用处,因为 Hazelcast 集群中存储的对象不是您的实体对象。 Hibernate 在 L2 中使用自己的数据(比如序列化)格式,将您的实体及其关系和集合转换为自己的格式,并将自己的对象(实现 java.io.Serializable)提供给 Hazelcast。 Hazelcast 使用标准的 java 序列化将那些序列化并跨集群分发。

    如果您的类具有复杂而深入的对象图(大量使用组合对象和 1xn 或类似关系),则此双序列化问题会导致长时间延迟。

    Hazelcast 与 Hibernate 的延迟加载无关。 Hibernate 已经分别存储了实体及其关系和集合映射。所以所有这些都可以从 Hazelcast 一个一个地加载。但是在您的用例中,如果总是加载大多数可延迟加载的关系,那么这将导致多个远程 Hazelcast 调用而不是一个。所以你应该仔细考虑在哪里使用延迟加载。

    另一个技巧是使用/启用 Hazelcast 近缓存,如果您的应用主要是只读的。 (顺便说一句,如果不是,那么使用 L2 缓存可能不适合您。)这样您将节省大量远程调用,并且经常需要的数据将被缓存在本地。近缓存支持所有 Hazelcast 地图属性,例如 TTL、驱逐、最大尺寸等。

    Hazelcast Near-Cache documentation...

    【讨论】:

    • 感谢您的精彩回答,这对我们帮助很大。
    猜你喜欢
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2011-09-11
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多