1. Обзор
В веб-приложениях создание некоторых отчетов может занять много времени для расчета базы данных; некоторые веб-сайты предоставляют информацию о погоде, что требует доступа к удаленному серверу для выполнения вызова SOAP для получения информации о температуре. Все это примеры сложной информации. Добавление слишком большого количества сложной информации на веб-страницу может привести к перегрузке веб-сервера и сервера базы данных. Буферизация блоков кода JSP дает разработчикам свободу добавлять любую сложную информацию по своему желанию.
JSP может инкапсулировать и запускать сложный код Java в библиотеке тегов, что упрощает обслуживание файлов страниц JSP и делает более удобным для непрофессиональных разработчиков использование файлов страниц JSP. Уже существует множество библиотек тегов, которые являются либо коммерческими продуктами, либо продуктами с открытым исходным кодом. Но большинство этих продуктов используют библиотеки тегов только для реализации функций, которые можно реализовать с помощью простого Java Scriptlet. Лишь немногие продукты используют пользовательские теги каким-либо творческим способом, обеспечивая почти ту же функциональность до появления пользовательских библиотек тегов JSP. Использование невозможно.
Библиотека тегов OSCache, разработанная OpenSymphony, представляет собой новаторское приложение для пользовательских тегов JSP, которое обеспечивает быстрое кэширование в памяти существующих страниц JSP. Хотя есть несколько поставщиков, предлагающих продукты кэширования в различных формах, все они являются продуктами конкретных поставщиков. OSCache может работать на любом сервере, совместимом с JSP 1.1, и может кэшировать существующие блоки кода JSP не только для всех пользователей, но также для каждого пользователя. OSCache также включает в себя некоторые расширенные функции для улучшения масштабируемости, такие как буферизация на диск, программируемая очистка буфера, контроль исключений и т. д. Кроме того, как и другие продукты OpenSymphony, код OSCache распространяется свободно по лицензии с открытым исходным кодом.
В этой статье в качестве примера используется воображаемый процесс разработки веб-сайта аукциона, чтобы представить рабочий процесс OSCache. Этот воображаемый веб-сайт будет включать в себя: страницу управления, сообщающую о последних аукционных действиях; полнофункциональную домашнюю страницу с различной рекламной информацией и специальную панель навигации, содержащую информацию обо всех неурегулированных аукционных действиях пользователя;
2. Страница управления
Веб-сайт аукциона содержит отчет управления, и серверу базы данных требуется несколько секунд для создания такого отчета. Важно, чтобы создание отчета занимало много времени, поскольку у нас может быть несколько администраторов, контролирующих работу системы, и мы хотим избежать повторного создания отчета при каждом посещении администратора. Для этого мы инкапсулируем всю страницу в тег буфера уровня приложения, который обновляется каждый час. Некоторые продукты других производителей имеют схожий функционал, просто OSCache делает это лучше них.
Для простоты мы не будем слишком много внимания уделять вопросам форматирования. При написании страницы управления мы сначала добавляем на страницу объявление библиотеки тегов:
<%@ taglib uri="cachetags" prefix="cache" %>
Далее нам нужно окружить всю страницу тегами кэша. Время кэширования по умолчанию для тегов кэша составляет 1 час.
<cache:cache> .... Сложные отчеты управления... </cache:cache>
Теперь страница управления кэширована. Если администратор снова обратится к той же странице в течение часа после ее создания, он увидит ранее закешированную страницу, и серверу базы данных не потребуется повторно генерировать этот отчет.
3. Домашняя страница
На главной странице веб-сайта аукциона отображается активность сайта и рекламируются аукционы, которые вот-вот закончатся. Мы хотим отображать количество текущих аукционов, количество вошедших в систему пользователей, список аукционов, которые должны завершиться в ближайшем будущем, и текущее время. Эти сообщения имеют разные требования к точности времени. Аукционы на сайте обычно длятся несколько дней, поэтому мы можем установить время буферизации количества действительных аукционов до 6 часов. Количество пользователей, очевидно, будет меняться чаще, но здесь мы будем буферизовать это значение по 15 минут за раз. Наконец, мы хотим, чтобы текущее время, отображаемое на странице, всегда было точным временем доступа к странице.
После объявления библиотеки тегов на домашней странице мы сначала выводим текущую дату напрямую, без буферизации:
теперь это: <%=new java.util.Date()%>
Далее мы хотим отобразить список тех, которые будут участвовать в аукционах. которые заканчиваются в краткосрочной перспективе:
<cache:cache> <ul> <% // Создаем итератор, содержащий самые последние аукционы Iterator Auctions = .... while (auctions.hasMore()) { Аукционный аукцион = (Аукцион) аукционы .next(); %><li><%=auction%></li%< } %> </ul> </cache:cache>
Наконец, мы хотим отобразить количество текущих аукционных действий, которые нужны этим числам. находиться в буфере в течение 6 часов. Поскольку для маркировки кэша требуется количество секунд для кэширования данных, мы преобразуем 6 часов в 21600 секунд:
<cache:cache time="21600"> <% //Запросим базу данных, чтобы получить общее количество аукционных действий int AuctionCount = .. .. %> На этом веб-сайте проводится <%=auctionCount%> текущих аукционов! </cache>
Как видите, мы используем лишь небольшой объем кода для создания домашней страницы со сложной системой буферизации. Эта система буферизации буферизует каждую часть страницы отдельно, и время буферизации каждой части полностью соответствует частоте изменений соответствующей информации. Благодаря буферизации теперь мы можем размещать больше контента на домашней странице; без буферизации раньше размещение слишком большого количества контента на домашней странице приведет к замедлению доступа к странице и даже может вызвать проблемы с сервером базы данных.
4. Панель навигации.
Предположим, при планировании веб-сайта мы решили отобразить содержимое корзины покупок под левой панелью навигации. Мы будем отображать количество ставок и текущую цену для каждого предмета на аукционе пользователя, а также список всех тех предметов, по которым у текущего пользователя самая высокая ставка.
Мы используем возможности буферизации на уровне сеанса для создания вышеуказанных функций на панели навигации. Поместите следующий код в шаблон или включаемый файл, чтобы другие страницы веб-сайта могли ссылаться на эту панель навигации:
<cache:cache key="navbar"scope="session" time="300"> <% //Извлечение и отображение текущая информация о ставке%> </cache:cache>
Здесь мы вводим два важных атрибута, а именно ключ и область действия. В коде, приведенном ранее в этой статье, поскольку тег кэша может автоматически создавать уникальный ключ для блока кода, нам не нужно устанавливать этот атрибут ключа вручную. Но здесь мы хотим ссылаться на этот кэшированный блок кода из остальной части сайта, поэтому мы явно определяем ключевой атрибут тега кэша. Во-вторых, атрибут области используется для указания кэшу отметить, что текущий блок кода должен быть буферизован для каждого пользователя, а не один раз для всех пользователей.
Вы должны быть очень осторожны при использовании буферизации на уровне сеанса, и это должно быть ясно: хотя мы можем сделать сложную панель навигации уменьшить нагрузку на сервер в 5 или 10 раз, это значительно увеличит объем памяти, необходимый для каждого сеанса. Несомненно, идеально увеличить количество возможных одновременных пользователей с точки зрения возможностей ЦП, но как только количество одновременных пользователей снизится до предела ЦП с точки зрения возможностей поддержки памяти, это решение перестанет быть идеальным.
Как упоминалось ранее в этой статье, мы хотим ссылаться на этот буферизованный блок кода из остальной части сайта. Это связано с тем, что когда пользователь добавляет предмет на аукцион или делает ставки на предметы, выставленные на аукционе другими пользователями, мы хотим обновить буфер, чтобы при следующем чтении на панели навигации было самое последнее содержимое. Хотя эти данные могут меняться из-за активности других пользователей, пользователю может быть очень сложно увидеть, что его или ее список остается неизменным после выполнения действия на сайте.
Тег сброса, предоставляемый библиотекой OSCache, может обновлять содержимое буфера. Мы можем добавить на страницу следующий код, который обрабатывает действия пользователя и может влиять на эту область:
<cache:flush key="navbar"scope="session" />
Когда пользователь обращается к ней в следующий раз, блок буфера панели навигации будет обновлен. .
На данный момент создание нашего примера веб-сайта завершено и можно приступить к работе. Давайте посмотрим на возможности обработки исключений OSCache. Даже если буферизованное содержимое было признано недействительным, например, из-за исключения Java, возникшего в буферном блоке, библиотека тегов OSCache по-прежнему позволяет нам отображать содержимое программным способом. С помощью этой функции контроля исключений мы можем разорвать соединение между сервером базы данных и веб-сервером, и веб-сайт по-прежнему сможет продолжать работу. В спецификации JSP 1.2 появился интерфейс TryCatchFinally, который позволяет самому тегу обнаруживать и обрабатывать исключения Java. Таким образом, разметку можно комбинировать с этим кодом обработки исключений, чтобы сделать страницы JSP более простыми и организованными.
OpenSymphony планирует реализовать дополнительные механизмы буферизации, а также более управляемую основную систему, которая позволит нам управлять оперативной памятью и дисковым пространством, используемым буферизацией. Как только эти функции будут реализованы, мы сможем еще больше улучшить скорость реагирования и надежность веб-сайта.
[Вывод]
OSCache может помочь нам создавать более красочные и высокопроизводительные веб-сайты. С помощью библиотеки тегов OSCache мы теперь можем использовать ее для решения некоторых проблем, влияющих на скорость реагирования веб-сайта, таких как периоды пикового трафика, перегруженные серверы баз данных и т. д.