Веб-приложение Java: Как реализовать кэширующиеся методы?

Вы можете использовать Pipe и Map вложенные значения

this.AlvosService.getContas(this.identific, this.search)
          .pipe(
            switchMap((accounts) => accounts.map((account) => account.data))
          )
          .subscribe((customers) => { console.log(customers) }),
          (error) => { console.log(error); }

Примечание: лучше не использовать переменные, начинающиеся с заглавных букв, так как в AlvosService , что является плохой практикой

24
задан LordOfThePigs 31 March 2009 в 06:13
поделиться

4 ответа

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

Проблема с кэшированием. В основном Вы получаете xml через веб-сервис. Если Вы получаете доступ к этому веб-сервису через HTTP, можно установить простой сервер Прокси HTTP на стороне, которые обрабатывают кэширование xml. Следующий шаг будет кэшироваться разрешенного xml в своего рода кэше локального объекта. Этот кэш может существовать на сервер без любой проблемы. В этом втором случае EHCache сделает идеальное задание. В этом случае цепочка обработки будет похожа на это Client - http request -> servlet -> look into local cache - if not cached -> look into http proxy (xml files) -> do proxy job (http to webservice).

Профессионалы:

  • Локальный кэш на экземпляр сервера, который содержит только объекты от требуемого xmls
  • Один прокси HTTP, работающий на тех же аппаратных средствах как наше веб-приложение.
  • Возможность масштабировать веб-приложение, не добавляя новых прокси HTTP для XML-файлов.

Недостатки:

  • Следующий уровень инфраструктуры
  • +1 точка отказа (прокси HTTP)
  • Более сложное развертывание

Обновление: не забывайте всегда отправлять запрос ГОЛОВЫ HTTP в прокси, чтобы гарантировать, что кэш актуален.

13
ответ дан 2 revs 28 November 2019 в 22:47
поделиться

Вот пример кэширования с EhCache. Этот код используется в нескольких проектах реализовать для данного случая кэширование.

1) Поместите свой кэш в глобальный контекст. (Не забывайте добавлять слушателя в WEB.XML).

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;

public class InitializationListener implements ServletContextListener {    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext ctx = sce.getServletContext();
        CacheManager singletonManager = CacheManager.create();
        Cache memoryOnlyCache = new Cache("dbCache", 100, false, true, 86400,86400);
        singletonManager.addCache(memoryOnlyCache);
        cache = singletonManager.getCache("dbCache");       
        ctx.setAttribute("dbCache", cache );           
    }
}

2) Получите экземпляр кэша при необходимости в нем. т.е. от сервлета:

cache = (Cache) this.getContext().getAttribute("dbCache");

3) Запросите кэш непосредственно перед тем, как Вы делаете дорогую операцию.

        Element e = getCache().get(key);
        if (e != null) {
            result = e.getObjectValue(); // get object from cache
        } else {
            // Write code to create the object you need to cache, then store it in the cache.
            Element resultCacheElement = new Element(key, result);
            cache.put(resultCacheElement);

        }

4) Также не забывайте делать недействительным кэшируемые объекты в надлежащих случаях.

Можно найти больше образцов здесь

37
ответ дан javito 28 November 2019 в 22:47
поделиться

Опция № 1: пользуйтесь библиотекой кэширования открытого исходного кода, такой как EHCache

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

Я рекомендовал бы EHCache, он находится под лицензией Apache. Вы захотите смотреть на примеры кода EHCace.

Опция № 2: используйте сквид

Еще более легкое решение Вашей проблемы состояло бы в том, чтобы использовать Сквид... Поместите Сквид, промежуточный процесс, который запрашивает данные, которые будут кэшироваться и система, выполняющая запрос: http://www.squid-cache.org/

8
ответ дан guerda 28 November 2019 в 22:47
поделиться

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

Я просто инстанцировал бы своего загрузчика конфигурации от ServletContextListener, и в contextInitialized () метод, я просто сохраню его в ServletContext с помощью ServletContext.setAttribute (). Затем легко искать его от самих сервлетов с помощью request.getSession () .getServletContext () .getAttribute ().

Я предполагаю, что это - надлежащий способ сделать это, не представляя пружину или любую другую платформу внедрения зависимости.

1
ответ дан LordOfThePigs 28 November 2019 в 22:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: