Hibernate延迟加载和Hazelcast

时间:2011-03-29 15:10:25

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

我们现在使用Hazelcast作为Hibernate二级缓存已经有一段时间了,但是当使用多个节点时,我们认识到存储和读取数据的长时间延迟。

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

Hazelcast Near-Cache documentation...