Hibernate ленивая загрузка и Hazelcast
Мы используем Hazelcast в качестве кеша 2-го уровня Hibernate уже некоторое время, но распознаем длительные задержки при хранении и чтении данных при использовании более одного узла.
Мы интенсивно используем составные объекты и отношения @OneToMany, и для повышения производительности мы решили загрузить эти составные объекты или коллекции с помощью отложенной загрузки Hibernate. Мы также реализовали DataSerializable для ускорения сериализации Hazelcast, как указано в документации Hazelcast. Но регистрация использования методов writeData/readData показала нам, что они на самом деле не использовались!
Для нас сейчас неясно, если Hibernate Proxy (который используется посредством отложенной загрузки) запрещает использование методов DataSerializable (потому что сам прокси может (?) Не реализовывать интерфейс) и - что еще более важно - если Hazelcast поддерживает отложенную загрузку вообще - и как!
1 ответ
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, выселение, максимальный размер и т. Д.