Кэширование (Ehcache) - Hibernate 2-й уровень кеша и Spring
В своем веб-приложении (Spring 3.1, Hibernate 4) я использую Ehcache для Hibernate 2-го уровня и Spring @Cache. Я хотел бы знать, где использовать Hibernate Cache и Spring Cache?
Например, у меня есть несколько классов домена (просмотр в базе данных), которые я использую в качестве значений поиска на экране. Я могу их кэшировать, используя Hibernate 2-го уровня, а также Spring @Cache.
Таким образом, в моем сервисном слое, если я кеширую эти доменные объекты с помощью Spring @Cache, я получу эти объекты, не затрагивая уровень персистентности вообще (Hibernate HQL-запрос), после кэширования. Это правильный подход?
2 ответа
Зависит от вашей архитектуры слоя.
Предположим, у вас есть три службы (или три метода в одной службе), которые все возвращают коллекцию Customer
сущности т.е. доменные объекты. Если вы кешируете на уровне сервиса, есть большая вероятность, что одно и то же представление одной записи базы данных будет жить в кеше несколько раз. Это несколько объектов, по сути, одной и той же информации. Зачем? Потому что результаты Service.getWhateverCustomers(String)
а также Service.getWhateverCustomers(String, Integer)
хранятся под двумя разными ключами кеша.
Если вы кешируете на уровне сущности с помощью аннотации JPA @Cachable с другой стороны, Customer
сущность кэшируется независимо от того, из какой службы или метода службы вы вызываете код, который фактически извлекает сущность. Конечно, применяются правила о том, когда провайдер JPA может / действительно кэширует сущность. Читайте о них, если вы не знакомы с ними.
Надеюсь, что это дает вам представление о том, какой путь выбрать. Если у вас есть дополнительные вопросы, оставьте комментарии, и я отредактирую этот ответ.
Правильный подход:
- Спросите себя, нужно ли вам возиться со сложностью кэширования. Ваше приложение не соответствует требованиям?
- Только если ответом на предыдущий вопрос является "да", профилируйте свое приложение, чтобы узнать, где находятся проблемы с производительностью.
- Определите подходящий способ решения проблемы производительности, определенной на шаге 2. Это может включать или не включать кэширование для предотвращения дорогостоящих операций. Если это действительно связано с кэшированием, то где кеширование и какой кеш использовать, должно быть совершенно ясно, потому что вы будете точно знать, что вы пытаетесь предотвратить.
Мораль этой истории в том, что вы не кешируете, потому что это круто. Вы кеш для производительности. И вы оптимизируете код только тогда, когда это окажется необходимым.