Кэширование (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 может / действительно кэширует сущность. Читайте о них, если вы не знакомы с ними.

Надеюсь, что это дает вам представление о том, какой путь выбрать. Если у вас есть дополнительные вопросы, оставьте комментарии, и я отредактирую этот ответ.

Правильный подход:

  1. Спросите себя, нужно ли вам возиться со сложностью кэширования. Ваше приложение не соответствует требованиям?
  2. Только если ответом на предыдущий вопрос является "да", профилируйте свое приложение, чтобы узнать, где находятся проблемы с производительностью.
  3. Определите подходящий способ решения проблемы производительности, определенной на шаге 2. Это может включать или не включать кэширование для предотвращения дорогостоящих операций. Если это действительно связано с кэшированием, то где кеширование и какой кеш использовать, должно быть совершенно ясно, потому что вы будете точно знать, что вы пытаетесь предотвратить.

Мораль этой истории в том, что вы не кешируете, потому что это круто. Вы кеш для производительности. И вы оптимизируете код только тогда, когда это окажется необходимым.

Другие вопросы по тегам