Java Servlet Pooling - PullRequest
       6

Java Servlet Pooling

3 голосов
/ 18 ноября 2009

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

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

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

Приветствия и спасибо.

Ответы [ 4 ]

6 голосов
/ 18 ноября 2009

Реализуйте 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>

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

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

1 голос
/ 18 ноября 2009

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

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

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

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

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

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... 
}

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

0 голосов
/ 18 ноября 2009

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

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

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

...