Добрый день, хабралюди! 2 недели назад я начал работать младшим Java-разработчиком и, соответственно, получил много нового опыта.
Сегодня я решил совместить приятное с полезным и начать излагать этот опыт в письменной форме – в виде статей о технологиях, принципах и приемах, с которыми я столкнулся на своем юношеском пути.
Следующая статья — первая в своем роде, и, размещая ее здесь, я хочу, во-первых, понять, нужны ли хабра-сообществу подобные вещи — истории не умудренных опытом и сотнями проектов старожилов, а небольших попыток.
передать опыт от джуниора к джуниору - а во-вторых, как обычно, услышать замечания, поправки и критику.
Спасибо за внимание.
Подавляющее большинство современных веб-приложений используют базы данных для хранения информации.
Приложение может обмениваться информацией с базой данных, используя соединение с базой данных.
Если вы будете создавать его каждый раз при обращении к базе данных, вы в итоге потеряете время: выполнение транзакции может занять несколько миллисекунд, а создание соединения — до нескольких секунд. С другой стороны, можно создать и одиночное соединение (например, используя шаблон « Синглтон ") и обращаться к базе данных только через нее.
Но такое решение чревато проблемами в случае высокой нагрузки: если сто пользователей одновременно попытаются получить доступ к базе данных по одному соединению, образуется очередь, что также пагубно влияет на приложение производительность.
Пул подключений к базе данных (dbcp) — это способ решить описанную выше проблему.
Подразумевается, что в нашем распоряжении имеется некий набор («пул») подключений к базе данных.
Когда новый пользователь запрашивает доступ к базе данных, ему предоставляется уже открытое соединение из этого пула.
Если все открытые соединения уже заняты, создается новое.
Как только пользователь освобождает одно из существующих соединений, оно становится доступным другим пользователям.
Если соединение не используется в течение длительного времени, оно закрывается.
Пример простой реализации пула соединений можно найти на официальном сайте java.sun.com: Пул соединений Поскольку этот подход наиболее полезен в случае корпоративных и веб-приложений, логично, что такой популярный контейнер сервлетов, как Apache Tomcat, предоставляет собственное решение для создания dbcp. Это решение основано на библиотеке Apache-commons-dbcp .
Чтобы реализовать поддержку пула соединений для вашего приложения, вам необходимо пройти несколько шагов.
Сначала вам необходимо объявить новый ресурс в контексте приложения.
Ресурс (в нашем случае база данных) описывается следующим кодом: <Resource name="jdbc/appname" auth="Container"
type="javax.sql.DataSource" maxActive="100"
maxIdle="30" maxWait="10000"
username="username"
password="password"
driverClassName="jdbc.driver.name"
url=" jdbc:protocol://hostname:port/dbname"/ >
Думаю, пояснения не нужны.
Контекст приложения описывается XML-файлом.
Я считаю правильным хранить его в %document_root%/META-INF/context.xml, однако это не единственный вариант. Подробнее о контексте можно прочитать на сайте Tomcat: Контекстный контейнер .
Теперь вам нужно добавить ссылку на этот ресурс в web.xml: <resource-ref>
DB Connection
<res-ref-name>jdbc/appname</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Теперь мы можем использовать этот ресурс в нашем приложении.
Чтобы заставить объект Connection выполнить код sql, используйте следующий код: InitialContext initContext= new InitialContext();
DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/dbconnect");
Connection conn = ds.getConnection();
Для получения источника данных используется механизм JNDI (подробнее о нем можно прочитать Здесь )
Все! Теперь вы можете выполнить conn.createStatement() и реализовать логику работы с базой данных.
В конце, как обычно, следует закрыть соединение (conn.close()), однако, в отличие от обычного соединения через драйвер JDBC, это соединение фактически не будет закрыто: в пуле оно будет помечено как свободное, и можно использовать повторно позже.
Перед возвратом соединения в пул все Statements и ResultSets, полученные с помощью этого соединения, автоматически закрываются согласно API (спасибо Колвин за комментарий).
Теги: #пул соединений #db #dbcp #java #java ee #java
-
Imagine Cup `08: Из Парижа С Победой
19 Oct, 24 -
Я Профессионал - Что Это?
19 Oct, 24 -
Поддержка Обратной Связи Геймпада В Wot
19 Oct, 24