Блог о программировании

Февраль 7, 2012

 

Tomcat и jdbc connection pool

В общих чертах что такое пул.

Пул (pool) - это такой "бассейн" иди "резервуар" из которого можно брать "живые" объекты для дальнейшего их использования.
В данной статье будут рассматриваться только пулы подключений к БД, но в жизни программиста могут повстречаться пулы разных объектов, например многим знаком Thread Pool.
В общем случае, пул "каких-то объектов" - это шаблонный способ решения проблемы хранения и раздачи объектов (и самое главное поддержания их в нормально рабочем состоянии).

По аналогии с бассейном, в нормальных пулах постоянно протекают некоторые процессы. Например осуществляется проверка не "протухли" ли объекты. Нужно ли создать новые? Сколько времени объекты находятся в пуле? Во многих пулах есть своя "ватерлиния" (high water mark), которая указывает на максимальный "объем" пула.

В этой статье будет кратко описан JDBC Connection Pool.

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

Существует несколько реализаций пулов подключений к БД.

Можно даже сделать свою имплементацию. Это не сверхзадача. Опасность заключается в том, что если сделать чуть-чуть не аккуратно, то ваш бассейн начнет протекать или объекты будут "тухнуть".
Для серверного ПО это особо не приятно.
Тем не менее, в 90-ые годы многие java программисты писали свои connection pool.

Сейчас конечно можно взять готовый.

Сразу хотел сказать про тех, кого проблемы выбора пула не должны сильно волновать.

  • У вас нормальный Application Server. В этом случае у вас готовый, надежный промышленный пул "из коробки".
  • Вы используете СУБД Oracle. У вас реализация пула "из коробки" - в jar-ике с драйверами.

В обоих случаях, самое главное научиться всё правильно настраивать.

Если вы не можете себе позволить нормальный сервер (или оракл), то можно попробовать разобраться с решениям "для бедных".

Итак варианты:

DBCP

DataBase Connection Pool - этот пул очень долгое время приводится в примерах на сайте Apache Tomcat.
Это не самый лучший пул, т.к. может создать deadlock-и. На данный момент я бы не стал его рекомендовать для применения в реальных (продакшн) версиях.

C3P0


Название этого пула созвучно с именем робота золотистого цвета из звездных войн (в фильме этого робота создал молодой Дарт Вейдер, он же Анакин Скайоукер).
Краткое объяснение этому названию следующее: Connection Pool 3.0 -> СP30 -> C3P0. Подробности можно прочитать по ссылке.

Это действительно неплохой пул. Например, в какой-то момент создатели одного известного ORM-фреймворка стали приводить в своих примерах именно работу с с3p0 (и ругаться на dpcp).

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

Можно скачать с сайта (ссылка) или установить из maven-репозитория (groupId:c3p0, artifactId:c3p0).

Принцип настройки JNDI ресурсов в томкате думаю объяснять не нужно. Всё просто. Можно указать как глобальные ресурсы, а в веб-приложении указать ссылку, либо можно указать непосредственно в context.xml. Все зависит от того, где у вас хранятся библиотеки и какая у вас конфигурация сервера.

Пример настройки (MySQL):

<Resource auth="Container" description="DB Connection" driverClass="com.mysql.jdbc.Driver" user="user" password="password" jdbcUrl="jdbc:mysql://localhost:3306/databasename?useUnicode=yes&amp;characterEncoding=UTF-8" factory="org.apache.naming.factory.BeanFactory" type="com.mchange.v2.c3p0.ComboPooledDataSource" name="jdbc/db" maxPoolSize="10" minPoolSize="0" maxConnectionAge="100" acquireRetryAttempts="60" acquireIncrement="1" preferredTestQuery="SELECT 1" testConnectionOnCheckout="true" />

Важно! Установить пул особого ума не требует. Основная задача настроить так, чтобы он стабильно работал и выдерживал нагрузку.
Значение каждого параметры нужно прочитать в документации.

Некоторые важные детали:

  • Может оказаться, что JDBC URL есть амперсанд (&). Если настройка осуществляется через XML-файл, то & надо заквотить (вместо param1=value1&param2=value2, пишем param1=value1&amp;param2=value2).
  • preferredTestQuery - запрос который проверяет подключение к БД. Зависит от конкретной СУБД.
  • testConnectionOnCheckout - прожорлив, если можно то лучше не использовать.
  • maxPoolSize и minPoolSize - возможные максимальное и минимальное количество подключений в пуле.
  • acquireRetryAttempts - если СУБД не доступна, сколько раз пытаться подключится. Ставим в 0 если хотим, чтобы долбились до бесконечности.

Tomcat 7 JDBC Pool


В 7-ом Tomcat выпустили свой собственный пул. Подробнее можно прочитать на сайте.

<Resource name="jdbc/db" auth="Container" description="DB Connection" username="username" password="password" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/databasename?useUnicode=yes&amp;characterEncoding=UTF-8" maxActive="10" maxIdle="3" maxWait="100" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" type="javax.sql.DataSource" />

Некоторые важные детали:

  • Нужно быть внимательным с атрибутами. Например в с3p0 был атрибут user, здесь - username (driverClass - driverClassName, jdbcUrl - url). Поскольку реализация разная, поэтому и настройки отличаются!
  • Можно использовать и не в семерке. Из дополнительных зависимостей - tomcat-juli.jar.

Про Oracle


C Oracle все не просто. Как правило, Oracle используют серьезные организации, у которых должен быть штатный ДБА-шник. Самый правильное и разумное решение, чтобы тюнинг подключения к СУБД осуществлял как раз администратор баз данных.
Если у вас Oracle XE (бесплатная), то у вас может быть целый букет разного рода ошибок и сложностей связанных с локалью и настройкой.
Поскольку эта статья не про то, как настроить Oracle XE, а про пулы подключений, поэтому приведу примерную конфигурацию, которую использую для девелоперских целей.

<Resource auth="Container" factory="oracle.jdbc.pool.OracleDataSourceFactory" type="oracle.jdbc.pool.OracleDataSource" name="jdbc/db" user="scott" password="tiger" connectionCachingEnabled="true" url="jdbc:oracle:thin:@localhost:1521:XE" />
  • Важно! Это только для разработки. В продакшн такую настройку использовать не стоит. Проконсультируйтесь с вашим DBA! Это не шутка.
  • Еще раз внимательно с атрибутами. Отличаются от с3p0 и tomcat 7 jdbc pool
  • Это пример для Oracle 10-ка XE. Для других версий нужно читать документацию, но принцип тот же. Если собираетесь использовать нагугленные из интернета примеры, то обратите внимание на аттрибут factory. В интернете очень много ложных примеров.

Java на habrahabr

Февраль 3, 2012

 

JAVA / [Из песочницы] SOAP-сервер на Java при участии Apache CXF и Spring

За последнее время появилось несколько статей, рассказывающих о протоколе SOAP, а также описывающих процесс создания сервера на различных языках и платформах. Продолжим тему. В этой статье будет описываться создание сервера на языке Java с использование Apache CXF и Spring Framework. Предполагается, что читатель уже имеет общее представление об упомянутом протоколе, а также о работе с ant и maven. Для того, чтобы сделать задачу немного интереснее, добавим начальное условие: дана WSDL-схема, описывающая веб-сервис. Итак…
(Картинка из статьи на Wikipedia.)

Блог о программировании

Декабрь 30, 2011

 

Работа с Maven + Tomcat

Maven и Tomcat


Ни для кого не секрет, что maven-ом можно деплоить проекты в Apache Tomcat.
Правда многие разработчики все-таки используют функции, встроенные в среду разработки (в Netbeans - из коробки, в Eclipse - ставим плагин).
Это удобно и просто, но к сожалению, мне приходится часто "перескакивать" с разных IDE и поэтому в некоторых своих проектах я предпочитаю сразу настроить tomcat:deploy.

На данный момент использую "tomcat-maven-plugin".

Запуск осуществляется командой: mvn tomcat:deploy.

Для удобство можно указать в IDE, чтобы эта команда выполнялась на действие "Run" или повесить на нее какой-нибудь HotKey.

Сборку финальной версии и развертывание приложения на "боевом" сервере, я, как правило, осуществляю вручную, т.к. далеко не всегда на реальных работающих серверах из внешнего мира доступен интерфейс для переразвертывания веб-приложений.

В случае, если мы работаем в простых условиях, когда у нас имеется свой apache tomcat-ом установленный на локальном компьютере, то настройка довольно простая.
Нам нужно три файла.

  • tomcat-users.xml
  • settings.xml
  • pom.xml
  • tomcat-users.xml

    Файл, как правило, находится рядом с другими файлами для настройки сервера: APACHE_TOMCAT_DIR/conf/tomcat-users.xml

    В нем нужно проверить, что создана роль "manager" и существует пользователь с этой ролью.
    Что-то вроде этого:

    <tomcat-users> <role rolename="manager"/> <user username="user" password="123456" roles="manager"/> </tomcat-users>

    Таким образом, apache tomcat будет знать, что пользователю "user" можно развертывать у него war-ики.

    settings.xml

    Maven-овский файл с настройками. Есть глобальный файл на систему, есть под каждого пользователя.

    Я меняю как правило свой, пользовательский, он находится здесь:
    ${user.home}/.m2/settings.xml

    Если в Windows, то это будет файл "C:\Documents and Settings\имя_пользователя\.m2\settings.xml"

    В нем нужно указать Maven-у с каким логином и паролем нужно обращаться на сервер, чтобы запустить приложение.

    <?xml version="1.0" encoding="UTF-8"?> <settings> <servers> <server> <!-- id это просто идентификатор, используете удобное для вас название! Я называю так, чтобы не запутаться, т.к. у меня есть еще сервера других версий и других целей. --> <id>apache-tomcat-6.0.32</id> <!-- имя пользователя, которое вы указали в tomcat-users.xml --> <username>user</username> <!-- ну и естественно его пароль из tomcat-users.xml --> <password>123456</password> </server> </servers> </settings> </xml>

    pom.xml

    Теперь в pom.xml указываем настройки для деплойщика: project/build/plugins/plugin tomcat-maven-plugin

    <project> ... <build> ... <plugins> ... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <configuration> <!-- id-шник из settings.xml --> <server>apache-tomcat-6.0.32</server> <url>http://localhost:8080/manager</url> <path>/mywebapp</path> </configuration> </plugin> ... </plugins> ... </build> ... </project>

    Таким образом в pom.xml указывается только id сервера. Этот способ хорош тем, что вы не показываете в этом файле свой логин и пароль от личного tomcat-а. Это важно поскольку pom.xml часто бывает общественным файлом (т.к. хранят его в репозиториях вместе с исходниками).

    Если резюмировать, то в целом все довольно просто. Нужно показать tomcat-у кому можно деплоить (tomcat-users.xml), показать maven-у к какому серверу и с каким логином и паролем стучаться (settings.xml) и настроить файл проекта, чтобы maven знал на какой конкретно сервер разворачивать (pom.xml).

    Java на habrahabr

    Декабрь 21, 2011

     

    JAVA / Session replication and sticky sessions in Java PaaS

    Рады с вами поделиться нашим очередным достижением: теперь Jelastic предоставляет возможность использовать репликацию сессий между серверами приложений. Включить репликацию очень просто — всего один клик и вы обладатель High Availability (HA) окружения. Давайте рассмотрим подробнее, как это работает и какие преимущества вы получаете.
    В текущем решении, Jelastic настраивает репликацию сессий между парами серверов. Эти пары образуют кластеры.

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

    На протяжении сессии пользователь продолжает работу с одним и тем же инстансом (работают так называемые Sticky Sessions). Если один из инстансов упал, запросы пользователей, которые обрабатывались в нем, автоматически перебрасываются на другой инстанс этого же кластера. Благодаря репликации, второй инстанс уже имеет все сессии упавшего «коллеги», так что конечные пользователи абсолютно ничего не заметят.

    Java на habrahabr

    Декабрь 14, 2011

     

    JAVA / Ant+Tomcat: небольшая автоматизация рутины

    День добрый всем. Решил написать заметку о небольших средствах автоматизации, которые возникли в процессе моей работы со связкой Ant+Tomcat. Работаю java-разработчиком, с недавних пор пришлось окунуться в web-разработку на Java (надо сказать не без удовольствия). Никогда с серьезными проектами для web на java не сталкивался, игрался пару раз с примерами в рамках книжек по java из серии «обо всем по немного», но ничего серьезного. А здесь проект из полноценного портала с backend`ом для отвественных за контент, большими объемами данных в БД. Ну что же столкнулся да и столкнулся. Работа пошла, новая область знаний — интересно, мелочи не достают. Но со временем процесс сборки и развертывания приложения стал очень сильно доставать, так как в самые «жаркие» дни приходилось выполнять эту операцию раз по 40, чтобы посмотреть результат работы и прощелкать его. Вот тут и возник вопрос, нельзя ли это как то автоматизировать.

    Java на habrahabr

    Декабрь 13, 2011

     

    JAVA / Jelastic PaaS — статистика использования баз данных, серверов и JVM в ноябре

    Мы продолжаем делиться с вами статистикой использования программного стека на платформе Jelastic. Какими же были предпочтения девелоперов в прошлом месяце?

    Статистика использования баз данных MySQL, MariaDB, PostgreSQL и MongoDB

    Начнем с SQL баз. Как и прежде MySQL остается неоспоримым лидером. PosgreSQL занимает второе почетное место, за ней следует MariaDB. Единственная среди наших NoSQL баз, MongoDB показала очень хороший результат в ноябре.



    Если сравнить текущие данные с октябрьскими, то можно сделать вывод, что количество фанов каждой из баз практически не изменилось.
    Ситуация в регионах (Европа и Северная Америка).



    Текущие цифры

    Java на habrahabr

    Ноябрь 3, 2011

     

    JAVA / Jelastic — Cloud Java Hosting. Статистика использования серверов Tomcat, GlassFish и Jetty. П

    Как и обещали ранее, предоставляем статистику по серверам веб-приложений для Java. Статистические данные отображают текущий срез использования серверов в облачной Java Hosting платформе Jelastic. В статистической выборке участвовало более 2000 окружений. Справедливости ради, стоит отметить что сервера GlassFish и Jetty были добавлены позже. Это обстоятельство влияет на конечную статистику. Тем не менее, мы должны показать текущее состояние, для того чтобы провести анализ изменений в следующем месяце.



    Распределение серверов по регионам

    Java на habrahabr

    Сентябрь 28, 2011

     

    JAVA / Jelastic — Java cloud platform for hosted service providers



    Это наш новый промо-ролик для хостинговых компаний. Он раскрывает не все наши преимущества и функциональность, но довольно понятно и вкратце объясняет что мы делаем и зачем. На текущий момент у нас есть два крупных партнера — это хостинговые компании в Европе и в США. Скоро будут объявленны официальные пресс релизы по этому поводу. Есть ряд заинтересованных хостеров в Японии, Австралии и других странах. Jelastic старается сделать облачный хостинг более распространенным решением, дабы дать разработчикам максимальную свободу и независимость при выборе поставщика облачных услуг.

    Java на habrahabr

    Сентябрь 17, 2011

     

    JAVA / Модульное веб-приложение с использованием CGLib


    Вступление


    В процессе разработки одного из проектов мы достигли той точки, когда новый функционал так или иначе задевает старый.
    Каскадные изменения десятка файлов ради нескольких новых кнопочек на форме — что может быть ужасней?
    На общем собрании команды было принято волевое решение — переписать!
    Была разработана модульная структура, которая позволяет добавлять функционал в виде отдельных модулей, не трогая при этом ни ядро, ни другие подсистемы, с возможностью hook ( aka callback )-функций, для реализации различной пре- или пост- обработки.
    Итак, базовый набор:
    Apache Tomcat 7.0.21, Hibernate 3, CGLib 2, JSF 2.0

    Java на habrahabr

    Август 22, 2011

     

    JAVA / [Из песочницы] По следам поста «Быстрая разработка веб-приложений на Java»


    Мотивом написания данной статьи послужило прочтение поста «Быстрая разработка веб-приложений на Java» и небольшой когнитивный диссонанс, возникший после прочтения и вопрос, который продолжает попрежднему мучает меня — Зачем такие сложности? Если есть WTP!

     
    << < 1 из 2 > >>