Q1. EhCache очень хорошо работает как распределенный кэш Hibernate L2.
Мы используем это для нашего проекта.
Q2. Возможно несколько кешей.
- Все базы данных уже выполняют внутреннее кэширование, поэтому не беспокойтесь об этой части.
Однако проблема с базой данных
кеш в том что физически на
сервер базы данных, поэтому каждый запрос
включает в себя сетевой вызов (задержка,
полоса с ..). В этом весь смысл
из кешей по заявке
сервер.
- Кэш Hibernate L2 имеет некоторые особенности:
- очень легко работать (без кода, мало настроек)
- концептуально на уровне сущности (который довольно детализирован, нам иногда нужно кэшировать большие зерна, чтобы делать меньше запросов к базе данных),
- работает по идентификатору или коллекции (например, кэширование результата запроса по умолчанию деактивировано, поскольку сделать его полезным в общем случае невозможно).
- Когда Hibernate L2 не подходит, мы используем ту же библиотеку EhCache для кэширования данных (это не совсем сущности). Примеры вариантов использования:
- когда таблица большая (длина и количество записей) , использование памяти не позволит полностью ее кэшировать, но кэширование только трех полей для всех записей вполне допустимо. Возможно, к этим полям обращаются часто или они неизменны ...
- когда у нас много обращений к чтению в кэш, и каждый из них запускает вычисление (в кеше L2) с учетом имеющихся у нас объектов: результат вычисления может быть сохранен в кеше. (типичный пример, где для вычисления требуются данные из других таблиц, но детали не используются в конечном результате, поэтому кэш не хранит эти детали)
- , когда сущности в таблице логически группируются по категориям , и мы хотим запрашивать и кэшировать по одной категории за раз вместо обычной политики кэша L2, которая будет представлять собой одну сущность за раз.
В распределенном контексте это часто
переводит в аннулирование
категория в то время, когда один из их
сущности модифицируется, что функционально
логично для нас (и важно для
производительность, как в противном случае мы бы
должны сделать недействительными все эти
юридические лица; это потому что кеш
делает недействительным целый регион, или
конкретный объект, но в
между циклом, что плохо для производительности)
И другие, я уверен ...
Так что этот случай не тесно связан с базой данных, он обычно не хранит наши объекты Hibernate. Мы помещаем его в бизнес-уровень (а не в доступ к данным или Daos), чтобы сделать его доступным непосредственно для бизнес-кодов. Обратите внимание, что для нас это не прозрачный кеш, а вызов явной бизнес-службы (ответственной за этот кеш: загрузка ее, если данные отсутствуют, аннулирование по мере необходимости), которая выполняет операции или доставляет значения.
Забавная проблема с многопоточностью в этом кеше: поскольку к этому кэшу обращаются наши сотни веб-потоков, он должен быть поточно-ориентированным. Вы, вероятно, знаете, почему потокобезопасное значение является неизменным или клонируется при каждом вызове (что часто является проблемой производительности). Таким образом, все наши бизнес-кэши используют неизменяемые объекты, и производительность великолепна.