Java DAO кеширование - PullRequest
4 голосов
/ 12 мая 2010

Я занимаюсь разработкой среднего Java-приложения и столкнулся с небольшой проблемой из-за недостатка опыта.

У меня есть собственный DAO, который получает объекты "Article" из базы данных.У меня есть класс Article, а в DAO есть метод с именем getArticle(int id), этот метод возвращает Article.Article имеет объект Category, и я использую ленивую загрузку.

Итак, когда я запрашиваю категорию статьи (Article a = new Article(); a.getCategory();), класс Article получает Category отDAO, а затем возвращает его.

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

Мой вопрос: куда мне поместить этот кеш?Я могу поместить его в класс Article (в DTO) или в класс DAO.

Что вы скажете?

Ответы [ 5 ]

8 голосов
/ 12 мая 2010

Мой вопрос: куда мне положить этот кеш? Я могу положить это на Класс статьи (в 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, имеет три уровня кэширования:

  1. Сам объект . Когда категория загружается с отложенной загрузкой, она сохраняется в объекте article для последующего прямого доступа.
  2. Кэш первого уровня . Это кеш текущего сеанса / транзакции. Одна и та же сущность не будет загружена дважды, но будет извлечена из кэша.
  3. Кэш 2-го уровня . Это кеш для всех сессий / транзакций. Это соответствует опции кэширования значения в DAO. Кэш 2-го уровня иногда сложнее из-за причин, упомянутых выше.

Надеюсь, вы лучше увидите недостатки / преимущества каждого типа кэша. Для получения дополнительной информации, смотрите в популярной документации ORM. Эти вопросы являются общими и хорошо задокументированы.

8 голосов
/ 12 мая 2010

Рассматривали ли вы использование Hibernate ?

3 голосов
/ 12 мая 2010

Рассмотрите возможность использования Hibernate или даже его более простой формы (JPA)

3 голосов
/ 12 мая 2010

Цель DAO - абстрагировать механизм персистентности. Поскольку категория «откуда» (БД, файл на диске, сетевой сокет, кэш) является частью этого механизма персистентности, DAO должен «скрыть» ее от объекта, который ее потребляет.

0 голосов
/ 12 мая 2010

Это зависит от того, является ли ваш Article единственный класс для прямого доступа к DAO или нет.

Лично я бы реализовал кэширование в Article по той простой причине, что не все, использующие DAO, захотят кэшировать. Также с точки зрения того, что один класс может выполнять только одну и только одну вещь, поскольку у вас уже есть отложенная загрузка в Article, не имеет смысла перемещать часть пути загрузки в DAO

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...