Вопрос по проектированию БД в Java - PullRequest
1 голос
/ 06 июня 2011

У меня есть данные в БД, которые имеют иерархические отношения (могут быть представлены в виде дерева).
Прямо сейчас, когда запрос поступает на сервер, в БД выполняется рекурсивный запрос для создания списка в памяти (который является ветвью дерева, от листа к корню, который на самом деле существует) и выполнить обработку с использованием этого списка.
Это не очень эффективно, но, по крайней мере, пока работает и имеет преимущество в том, что если БД изменяется, изменения сразу же замечаются.
Во всяком случае, я хочу улучшить его и ищу шаблон для:
1) Не иметь постоянного доступа к БД
2) Если в БД сделано изменение, оно получает немедленно отражается
3) Может использоваться во всех местах сервера.
Существует ли стандартный шаблон дизайна, обычно используемый для подобных случаев? Или просто иметь структуру данных, поддерживаемую внутренним потоком, и при любом обновлении в БД перезагрузить все в структуре данных?

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

Вместо потока вы можете использовать решение для кэширования.Результат запроса будет кэшироваться и возвращаться при каждом запросе. Если какая-либо из таблиц в запросе будет изменена, вы сделаете кеш недействительным, дождитесь следующего запроса, чтобы получить новые значения и загрузить их в кеш.Это решение соответствует требованиям 1 и 2. Что вы подразумеваете под «Его можно использовать во всех местах сервера»?

Если вы используете Hibernate, это легко сделать с помощью второго уровня кеш , предостережение в том, что вы должны гарантировать, что только ваше приложение изменяет базу данных (без внешних процессов).

Если вы не используете Hibernate, вы можете свернуть свое собственное решение с помощью Ehcache .Вам нужно будет изменить метод, который возвращает структуру, чтобы проверить кеш, прежде чем запрашивать БД.Методы, которые вносят изменения в соответствующие таблицы, должны быть модифицированы для аннулирования кэша.

Ehcache также имеет интеграцию с Spring , но я никогда не пробовал.

1 голос
/ 06 июня 2011

Вы не даете много подробностей о том, какой инструмент ORM вы используете, но в Hibernate это можно сделать, объявив список детей. Ниже взято из производственного кода:

<hibernate-mapping>
   <class name="YourTreeClass" table="tree_table" dynamic-insert="true" dynamic-update="true">
   ...other properties...

      <list name="children" cascade="save-update" inverse="false" >
         <cache usage="nonstrict-read-write"/>
         <key column="parent_id"/>
         <one-to-many class="YourTreeClass" />
      </list>
    </class>
</hibernate-mapping>

Нет необходимости в хакерских фоновых потоках - при обновлении узла Hibernate заботится и делает недействительными соответствующие кэшированные записи.

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