Hibernate延迟加载和Hazelcast

And*_*eas 6 caching hibernate lazy-loading second-level-cache hazelcast

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

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

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

mdo*_*gan 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近缓存文档......