Struts2 статическое хранение данных / доступ - PullRequest
3 голосов
/ 08 августа 2011

Я пытаюсь найти обычный дизайн / подход для "статического / глобального"!доступ к данным / хранение в веб-приложении, я использую структуры 2. Справочная информация, у меня есть несколько таблиц, которые я хочу отобразить в своем веб-приложении.

Проблема 1. Таблицы будут только изменяться и обновлятьсяОдин раз в день на сервере я не хочу получать доступ к базе данных или загружать файл для каждого запроса на просмотр таблицы.Я бы предпочел загружать таблицы в какую-то глобальную память / кэш один раз (в день), и каждый запрос получает таблицу оттуда, а не обращается к базе данных.Я полагаю, что это общий сценарий, и существует ли установленный подход?Но я не могу найти это в данный момент.Для распорок 2: является ли ActionContext правильным местом для этих данных.Если это так, любая ссылка на учебное пособие была бы очень признательна.

Проблема 2. Таблицы хранились в XML-файле, который я распаковал с помощью JAXB, чтобы получить объекты таблиц, а также списки для таблиц.Для небольшого приложения это было нормально, но я думаю, что для веб-приложения хакерски хранить xml как ресурсы и читать в файле как контекст сервлета и анализировать, или это так?Я понимаю, что мне может быть сказано хранить таблицы в базе данных, доступ к которой осуществляется с помощью dao, и использовать hibernate для получения объектов.Мне просто любопытно, каков обычный подход с данными, уже сохраненными в файле XML?Учитывая, что у меня будут новые XML-файлы ежедневно.

Извинения, если вопросы являются базовыми, у меня есть большое количество книг / справочных материалов, но мне просто нужно время, чтобы получить ответы на проекты более высокого уровня.

Ответы [ 3 ]

2 голосов
/ 08 августа 2011

Не обращая особого внимания на параметры кэширования, я сам получал бы данные из БД, но только после того, как прошел интервал.

Обычно вы работаете в области действия, следующий уровень - это Сессияи самым глобальным является приложение.Простой способ проверить это - создать класс Action, который реализует ApplicationAware.Затем вы можете получить значения, помещенные туда, из любого jsp / action ... в любом месте, где вы можете получить ActionContext (который есть в большинстве случаев), см. http://struts.apache.org/2.0.14/docs/what-is-the-actioncontext.html

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

Этот метод увеличивает сложность, поскольку вы несете ответственность за управление некоторыми структурами данных и их взаимодействие с ORM.

Я сделал это для загрузки данных из таблиц, которые никогда не понадобятся.загружаться снова, и эти данные стоят сами по себе (мне не нужно находить связи между ними и другими таблицами).Это быстрое и грязное решение Stevens гораздо более надежное и, вероятно, окупит вас позже, когда потребуется дополнительная производительность.

1 голос
/ 08 августа 2011

Это не совсем относится к Struts2 вообще.Вы определенно не хотите пытаться хранить эту информацию в ActionContext - это объект для каждого запроса.

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

0 голосов
/ 16 августа 2011

Как упоминалось ранее, лучшим подходом будет использование EHCache или другого доверенного менеджера кэша.

Другой подход заключается в использовании фабрики для доступа к информации.Например, что-то вроде:

public class MyCache {
  private static MyCache cache = new MyCache();

  public static MyCache getCache() {
    return cache;
  }

  (data members) 

  private MyCache() {
    (update data members)
  }

  public synchronized getXXX() {
    ...
  }

  public synchronized setXXX(SomeType data) {
    ...
  }
}

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

synchronized (MyCache.getCahce()) { 
  MyCahce.getCache().getXXX();
  MyCache.getCache().getTwo();
  ...
} 

etc

Опять же, лучше использовать EHCache или что-то еще под ключ, так как это может быть непостоянным без хорошего понимания механизмов.Этот тип кэша также имеет проблемы с производительностью, поскольку он позволяет ОДНОМУ потоку читать / записывать в кэш одновременно.(Возможные способы ускорения - использовать локальные потоки и блокировки чтения / записи - но такие вещи уже встроены во многие из установленных менеджеров кэша)

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