Hibernate ленивая загрузка и Hazelcast - PullRequest
6 голосов
/ 29 марта 2011

мы уже некоторое время используем Hazelcast в качестве кэша Hibernate 2-го уровня, но распознаем большие задержки при хранении и чтении данных при использовании более одного узла.

Мы интенсивно используем составные объекты и отношения @OneToMany, и для повышения производительности мы решили загрузить эти составные объекты или коллекции с помощью отложенной загрузки Hibernate.Мы также реализовали DataSerializable для ускорения сериализации Hazelcast, как указано в документации Hazelcast.Но регистрация использования методов writeData / readData показала нам, что они на самом деле не использовались!

Сейчас нам неясно, предотвращает ли Hibernate Proxy (который используется посредством отложенной загрузки) методы DataSerializable(потому что сам прокси может (?) не реализовывать интерфейс) и - что еще более важно - если Hazelcast вообще поддерживает отложенную загрузку - и как!

1 Ответ

5 голосов
/ 29 марта 2011

DataSerializable Hazelcast не используется с кешем 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 ...

...