2011-03-29 187 views
6

我们现在使用Hazelcast作为Hibernate二级缓存,但是在使用多个节点时正在识别存储和读取数据的长时间延迟。Hibernate延迟加载和Hazelcast

我们大量使用组合对象和@OneToMany关系,为了提高性能,我们决定通过Hibernate延迟加载来加载这些组合对象或集合。我们还实施了DataSerializable以加速Hazelcast序列化,正如Hazelcast文档中所述。但是记录writeData/readData方法的使用表明我们实际上并未使用它们!如果Hibernate代理(通过延迟加载使用)阻止使用DataSerializable方法(因为代理本身可能(?)不实现接口),以及 - 更重要的是 - 如果我们现在还不清楚Hazelcast完全支持懒加载 - 以及如何!

回答

5

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

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

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

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

Hazelcast Near-Cache documentation...

+0

感谢您的伟大的答案,这帮助了我们很多。 – Andreas 2011-04-14 11:04:41

+0

不客气。 – mmdogan 2011-04-15 18:19:03