6

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

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

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

4

1 回答 1

5

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

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

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

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

Hazelcast 近缓存文档...

于 2011-03-29T18:12:59.720 回答