Мой вопрос: куда мне положить
этот кеш? Я могу положить это на
Класс статьи (в DTO), или я могу
положить его на класс DAO.
Как уже упоминалось, это действительно звучит как изобретение колеса. Но давайте все равно рассмотрим оба случая, чтобы вы лучше поняли, как работает ORM.
Если сохранить категорию в статье , одна и та же категория будет загружаться снова и снова, если к ней обращаются разные статьи.
getCategory() {
if( category == null ) { category = <load from DAO> }
return category;
}
Если вы сохраните его в DAO , тогда все статьи одной и той же категории будут полезны для кеша, но вы должны позаботиться и об обновлении кеша при изменении категории.
saveCategory( Category c ) {
cache.put( c.id, c );
<save in database>
}
Проблема этого подхода заключается в том, что (1) кэш может со временем увеличиваться и (2) внешнее обновление в базе данных никогда не будет отражено, если у вас нет механизма тайм-аута или способа очистки кеша .
На самом деле ORM, такой как Hibernate, имеет три уровня кэширования:
- Сам объект . Когда категория загружается с отложенной загрузкой, она сохраняется в объекте article для последующего прямого доступа.
- Кэш первого уровня . Это кеш текущего сеанса / транзакции. Одна и та же сущность не будет загружена дважды, но будет извлечена из кэша.
- Кэш 2-го уровня . Это кеш для всех сессий / транзакций. Это соответствует опции кэширования значения в DAO. Кэш 2-го уровня иногда сложнее из-за причин, упомянутых выше.
Надеюсь, вы лучше увидите недостатки / преимущества каждого типа кэша. Для получения дополнительной информации, смотрите в популярной документации ORM. Эти вопросы являются общими и хорошо задокументированы.