Кэширование в корпоративном веб-приложении

1

Я относительно новичок в использовании кеширования в более крупных программах, предназначенных для использования большим количеством людей. Я знаю, что такое кеширование и почему оно выгодно в целом, и я начал интегрировать EHCache в мое приложение, которое использует JSP и Spring MVC. В моем приложении пользователь выбирает идентификатор из выпадающего списка, и он использует класс java для захвата данных из БД в соответствии с выбранным идентификатором. Сначала выполняется запрос, и он возвращает объект ResultSet. В этот момент я смущен тем, что делать и чувствую, что что-то упускаю.

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

Итак, вы бы рекомендовали мне просто попытаться кэшировать весь возвращаемый результат? Если бы я сделал это, я предполагаю, что могу обновить список в кеше, если таблица БД обновлена новой записью? Любые предложения о том, как действовать и правильно вставлять в ecache то, что возвращается из БД?

Я знаю, что у меня много вопросов, и я, конечно же, ценю это, если кто-то может помочь! Вот фрагмент моего кода, поэтому вы понимаете, что я имею в виду.

rs = sta.executeQuery(QUERYBRANCHES + specifier);

          while (rs.next())
            {

              //for each set of fields retrieved, use those to create a branch object.
                //String brName = rs.getString("NAME");
                String compareID = rs.getString("ID");
                String fixedRegID = rs.getString("REGIONID").replace("0", "").trim();

                //CHECKING IF BRANCH IS ALREADY IN THE CACHE. IF IT IS NOT CREATE
                //THE NEW OBJECT AND ADD IT TO CACHE. IF THE BRANCH IS IN CACHE THEN CONTINUE
                if(!cacheManager.isInMemory(compareID))
                {

                Branch branch = 
                        new Branch(fixedRegID, rs.getString("ID"), rs.getString("NAME"), rs.getString("ADDR1"), rs.getString("CITY"), rs.getString("ST"), rs.getString("ZIP"));




                cacheManager.addBranch(rs.getString("ID"), branch);
                }
                else
                {
                    continue;
                }
            }

          retData = cacheManager.getAllBranches();
  • 1
    «В информатике есть только две сложные вещи: аннулирование кэша и присвоение имен». - Фил Карлтон
Теги:
spring
caching

1 ответ

1
Лучший ответ

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

Для получения результатов вам необходимо выполнить итерацию.

Чтобы избежать итерации всех элементов, вам нужно исключить уже кэшированные значения, которые возвращаются в select.

Я имею в виду, добавьте в свой select исключения исключение значения, которые вам не нужны, в этом случае значения уже кэшируются. (not like, <> и т.д.). Это уменьшит время итерации.

В противном случае, да, я боюсь, вам придется перебирать все возвраты, если ваш фильтр SQL не завершен.

Итак, вы бы рекомендовали мне просто попытаться кэшировать весь возвращаемый результат? Если бы я сделал это, я предполагаю, что могу обновить список в кеше, если таблица БД обновлена новой записью? Любые предложения о том, как действовать и правильно вставлять в ecache то, что возвращается из БД?

Не следует кэшировать очень динамичную бизнес-информацию.

Я рекомендую, чтобы вы использовали индексы базы данных, чтобы значительно увеличить вашу производительность и получить оттуда свои ценности. При необходимости используйте чистый родной SQL.

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

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

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

Если вам действительно нужно кэшировать бизнес-информацию, сообщите нам об этом, например, о том, что такое оборудование, платформа, база данных, пейзаж, пик доступа и т.д.

  • 0
    Спасибо за ваши ответы. Идея SQL-фильтра для того, что выбрать, довольно разумная вещь. Я попробую это, и это может даже быть частичным ответом на то, что я ищу, чтобы ускорить время.
  • 0
    Tx, пожалуйста, дайте мне знать о результатах, если можете, так как я скептически отношусь к усилению фильтров в select. Я думаю, что это зависит от сценария, и усилия по созданию этих фильтров будут не такими хорошими, как ожидалось.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню