Java сервлеты и пул соединений с базой данных - PullRequest
4 голосов
/ 10 октября 2009

Просто глядя на примеры пулов соединений в сети, все они реализуют пулы соединений для каждого сервлета. Таким образом, каждый сервлет имеет свой собственный пул соединений с базой данных. Мой вопрос: почему это предпочтительнее, чем глобальный пул соединений БД? Поскольку глобальный пул кажется более эффективным, чем пул на сервлет. ..

Кроме того, поскольку я думаю о реализации такого пула. Есть ли способ инициализировать класс перед сервлетами (кстати, я использую Jetty)? Я только начинаю разработку сервлетов, но это может показаться полезным для других вещей, таких как конфигурация. В противном случае я просто собирался использовать какую-то синглтоноподобную модель ..

Ответы [ 5 ]

7 голосов
/ 10 октября 2009

1) Я бы сказал, что стандартной практикой является установка пула соединений в качестве ресурса JNDI в дескрипторе контекста, что не будет делом для каждого сервлета.

2) Вы захотите реализовать и объявить ServletContextListener .

3 голосов
/ 10 октября 2009

Если честно, я не совсем понимаю, о чем вы. Может быть, вы могли бы предоставить образцы, которые вы смотрели.

Для меня «реальный» пул соединений должен быть полностью Servlet независимым, и использование пула соединений для каждого сервлета является более детальной информацией об использовании (и плохим IMO). Просто посмотрите на DBCP или c3p0 для хороших примеров пулов соединений, которые вы можете использовать в контексте "вне контейнера".

Также обратите внимание, что большинство (если не все) контейнеры фактически предоставляют свои собственные реализации пула соединений (иногда основанные на предыдущих упомянутых примерах), и я не вижу веской причины не использовать их. Стандартный способ их использования - зарегистрировать DataSource в службе имен JDNI. Сегодня DataSouce большую часть времени вводится через IoC. В старые времена часто использовался шаблон Service Locator .

В случае с Jetty посмотрите Примеры источников данных в документации.

2 голосов
/ 10 октября 2009

Очень часто веб-контейнеры предоставляют ConnectionFactory (или аналогичную) с использованием JNDI, который использует пул соединений, но способ его настройки не стандартизирован.

Пожалуйста, смотрите http://docs.codehaus.org/display/JETTY/DataSource+Examples, как это делается с Jetty.

2 голосов
/ 10 октября 2009

Мой вопрос: почему это предпочтительнее, чем глобальный пул соединений БД?

Это не так! Все сервлеты должны совместно использовать соединения в пуле!

Кроме того, поскольку я думаю о реализации такого пула.

Уже есть способы (Spring IoC) для внедрения подключений в пул, которые управляются контейнером.

. Есть ли способ инициализировать класс перед сервлетами (кстати, я использую jetty)?

Контейнер IoC может загружать каждый ресурс и сервлет!

Вы можете подключить сервлеты к пружине, зарегистрировав Spring dispatcherServlet и XML-файл, содержащий сопоставления и сервлеты как определения bean-компонентов!

Используйте следующие определения, если вы хотите только внедрить соединение и оставить оставшуюся часть сервлета как есть:

<bean name="simpleServletHandlerAdapter"
class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter" />


<bean name="simpleServletPostProcessor"
class="org.springframework.web.servlet.handler.SimpleServletPostProcessor" />
0 голосов
/ 10 октября 2009

Одно из преимуществ наличия пула соединений на сервлет состоит в том, что если один из сервлетов ведет себя неправильно и использует все свои доступные соединения, то у других сервлетов все равно будут доступны соединения в их отдельных пулах. Это повышает стабильность вашего приложения.

...