Шаблон справочных данных
Похож на этот поток, но не совсем так: как кэшировать информацию в безопасном режиме
Какова обычная схема работы с "справочными данными" - данными, которые часто считываются приложением, обычно выводятся в базу данных или файл свойств, но обновляются очень редко (дни, недели, месяцы)? Когда данные обновляются, они будут обновляться извне.
Будет ли это, как правило, единичный элемент, который я мог бы добавить с помощью DAO, и, таким образом, смог бы управлять собственным содержимым? Мне нравится идея выставления метода refresh() в этом сервисе, который будет вызывать обновление (т. Е. Через MBean - поэтому мне не придется отказов приложения).
Из другого потока SO кажется, что люди могут просто создавать экземпляры DAO всякий раз, когда это необходимо, и прозрачно кэшировать на этом уровне.
Мне нравится идея, что одноэтапная служба внедряется либо с реальным DAO, который загружает данные из базы данных, либо с mock/test-double, который возвращает жестко закодированный ответ. Однако, если бы я реализовал сервис как одиночный с помощью java enum, это сделало бы его подключение через Spring более проблематичным.
Итак, как другие люди обычно имеют дело со справочными данными? Запрос по желанию, но с кэшированием под одеялом? Или отдельный сервис в памяти?
1 ответ
Обычно я внедряю реализацию DAO в свой сервисный уровень с помощью Spring и, как вы упоминаете, часто имеет тестовую реализацию (XMLDao
, FlatFileDao
) в дополнение к моей реализации на основе SQL. Для небольших наборов данных я обычно пишу свой собственный кэш и сохраняю все данные, загруженные из базовой таблицы (таблиц), в память.
Сказав все это, я имею преимущество работы с достаточно маленькими наборами данных. Если бы я имел дело с большим набором данных, я мог бы рассмотреть готовые решения для кэширования, возможно, распределенные по нескольким JVM (например, Terracotta).
Как я упоминал в предыдущем потоке, я также предоставляю метод refresh(). В случаях, когда обновления данных не должны распространяться своевременно, я просто вызываю это вручную через MBean. В ситуациях, когда я хочу автоматизировать это, я использовал Tibrv для прослушивания обновлений из базы данных и обновления кэшированных данных (используя триггер MS-SQL для генерации сообщения Tibrv).
Я не совсем понимаю вашу ссылку на использование перечислений Java для реализации сервиса. Как это будет работать?