Java Servlet Pooling

Сервлеты 101 под Tomcat 6:

Может ли кто-нибудь любезно указать мне на хорошее объяснение лучшего способа, например. создать коллекцию дорогих объектов Foo во время запуска сервлета и спрятать их где-нибудь, где я могу получить к ним доступ при обработке каждого запроса?

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

Ура и спасибо.

4 ответа

Реализовать ServletContextListener, выполнить желаемую задачу загрузки во время contextInitialized() и сохранить результат в области применения ServletContext#setAttribute(), Он будет вызван во время запуска сервера, а область приложения доступна и внутри обычных сервлетов.

Основной пример:

public class Config implements ServletContextListener {
   public void contextInitialized(ServletContextEvent event) {
        List<Foo> foos = fooDAO().list();
        event.getServletContext().setAttribute("foos", foos);
    }
}

Сопоставьте это в web.xml обычный способ:

<listener>
    <listener-class>mypackage.Config</listener-class>
</listener>

Вот как получить к нему доступ в обычных сервлетах:

protected void doSomething(request, response) {
    List<Foo> foos = (List<Foo>) getServletContext().getAttribute("foos");
}

А вот как вы можете получить к нему доступ в JSP:

<c:forEach items="${foos}" var="foo">
    ${foo.someProperty}<br>
</c:forEach>

Тем не менее, я действительно не вижу, как это связано с "пулом сервлетов". Этот термин не имеет смысла.

Надеюсь это поможет.

У вас есть несколько вариантов:

  • Используйте commons-pool, инициируйте ваши объекты при загрузке, а затем позаимствуйте их из пула.
  • Убедитесь, что вам действительно нужен пул объектов. Во многих случаях вы можете создать только один объект и получить к нему доступ потокобезопасным способом. Хорошее место, чтобы посмотреть на весенние рамки.

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

Я не буду заполнять пул заранее, просто выделю новый объект, если пул свободных объектов пуст.

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

Вы можете использовать контекст сервлета.

Контекст сервлета является общим для всех экземпляров сервлета, и его жизненный цикл выходит за рамки запроса и сеанса.

Вы можете положить что-нибудь там, как:

public void doGet( HttpServletRequest request, HttpServletResponse response ) {

     ServletContext sc = getServletContext();

     List expensiveObjectList = ( List ) sc.getAttribute("someName");
     if( expensiveObjectList == null ) {
         expensiveObjectList = someExpensiveInitializationMethod();
         sc.setAttribute( "someName", expensiveObjectList );
     }

     // use the list... 
}

Вот ссылка, где вы можете прочитать больше об этом

Другие вопросы по тегам