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...
}
Вот ссылка, где вы можете прочитать больше об этом