Настройка Datasource в JBoss

При разработке WEB-приложения альтернативой применения JDBC-подключения к серверу БД можно выбрать класс DataSource, использующего JNDI (Java Naming and Directory Interface). В статье рассматривается вопрос настройки DataSource в сервере приложений JBoss для подключения к серверу БД Oracle. Но прежде чем говорить о DataSource, необходимо несколько слов сказать об JNDI.

JNDI

JNDI - это API для доступа к службам имен и каталогов. Службой имен, в самом широком смысле, называют систему, управляющую отображением множества имен во множество объектов. Зная имя объекта в системе, можно получить доступ к этому объекту или ассоциировать с этим именем другой объект. Самым наглядным примером JNDI является служба доменных имен DNS, которая определяет соответствие между понятными доменными именами (например, local.ru) и сетевыми IP-адресами (127.0.0.1). Отправляя DNS доменное имя, мы получаем соответствующий ему IP-адрес.

В службе каталогов поименованные объекты сгруппированы в древовидную структуру. Кроме того объекты каталога имеют атрибуты. Наиболее близким и понятным примером такой службы является файловая система. Объекты файловой системы - файлы - собраны в каталоги и идентифицируются путями, например, C:\windows\notepad.exe. У файлов есть атрибуты: скрытый, архивный, только для чтения и другие. Передавая файловой системе путь, можно получить содержимое соответствующего файла, записать в него какие-то данные, изменить его атрибуты.

JNDI предназначен для единообразного доступа к разнообразным службам имен и каталогов, включая упомянутые выше DNS и файловую систему, а также LDAP, DataSource. Разные службы каталогов интегрируются с JNDI через интерфейс поставщика услуг (Service Provider Interface, SPI).

Первая редакция спецификации JNDI была выпущена в 1997 г. корпорацией Sun Microsystems. В 2006 г. вышла спецификация JNDI версии 1.2. JNDI состоит из следующих пяти пакетов :

  • javax.naming - содержит основные классы и интерфейсы, необходимые для взаимодействия со службами имен. В частности, интерфейс Context для поиска объектов, привязки объекта к имени, создания и удаления контекстов;
  • javax.naming.directory - расширяет пакет javax.naming средствами взаимодействия со службами каталогов. Определяет интерфейс DirContext, позволяющий работать с атрибутами объектов каталога;
  • javax.naming.event - определяет классы и интерфейсы событий, происходящих в каталоге, а также средства перехвата этих событий;
  • javax.naming.ldap - предоставляет средства для работы со специфическими возможностями LDAP v3, не покрываемыми более общим пакетом javax.naming.directory. Однако эти возможности редко используются, и в большинстве случаев достаточно использовать пакет javax.naming.directory;
  • javax.naming.spi определяет способ интеграции новых систем имен или каталогов с JNDI,чтобы клиенты могли пользоваться этими службами из Java-программ средствами JNDI.

Использование JNDI для получения DataSource в java-приложении

Использование JNDI в программе, как правило, ограничивается всего несколькими строками. Типичным таким примером является подключение к серверу БД с использованием DataSource. Следующий код позволяет подключиться к источнику данных, привязанному к имени "java:jboss/datasources/slon". Этот источник данных определен в JBoss, и ниже будет показано, как его настроить.

import java.sql.Connection;

import javax.sql.DataSource;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
...
private  DataSource  ds  = null;
private  Connection  con = null;
...
try {
    InitialContext ctx = new InitialContext();
    ds = (DataSource) ctx.lookup("java:jboss/datasources/slon");
    if (ds != null) {
        con = ds.getConnection();
} catch (NamingException e) {
} catch (SQLException e) {}

Работа с JNDI всегда начинается с создания объекта InitialContext (или InitialDirContext в случае работы со службой каталогов). Конструктор этого объекта может принимать параметры, определяющие, к какой службе и каким образом подключаться. В данном случае параметры в конструктор не передаются, поэтому происходит подключение к службе имен сервера JBoss. Затем вызовом метода lookup() из службы имен извлекается объект DataSource, соответствующий имени "java:jboss/datasources/slon".

Класс DataSource предоставляет соединение с сервером БД в виде класса, реализующего интерфейс java.sql.Connection. То есть, DataSource управляет соединением с базой данных.

Какие преимущества даёт использование DataSource? Основное, что мы видим, так это отсутствие параметров учетной записи (login/password) и сервера БД (host, port). То есть, разработчики могут отлаживаться на тестовом сервере, а на рабочем сервере Заказчика WEB-приложение разместит уже знающий администратор/специалист.

Настройка DataSource в JBoss

Для настройки DataSource в JBOSS необходимо проделать 3 шага :

  1. Разместить JDBC-библиотеку подключения к серверу БД;
  2. Настроить файл конфигурации модуля подключения к серверу БД;
  3. Настроить DataSource в файл конфигурации standalone.xml.

На первом шаге была создана директория ${JBOSS_HOME}/modules/com/oracle/ojdbc6/main, в котором разместился файл ojdbc6.jar.

В этой же директории ${JBOSS_HOME}/modules/com/oracle/ojdbc6/main был создан файл module.xml со следующим контентом.

<module xmlns="urn:jboss:module:1.0" name="com.oracle.ojdbc6">
    <resources>
        <resource-root path="ojdbc6.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

На следующем шаге в раздел <datasources> файла ${JBOSS_HOME}/standalone/configuration/standalone.xml были внесен следующий код, в котором определялись параметры DataSource :

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
    <datasources>
        <datasource jta="false" jndi-name="java:jboss/datasources/slon"
                        pool-name="slon" enabled="true" use-ccm="false">
            <connection-url>
                jdbc:oracle:thin:@[host]:1521:[sid]
            </connection-url>
            <driver-class>oracle.jdbc.OracleDriver</driver-class>
            <driver>oracle</driver>
            <pool>
                <min-pool-size>5</min-pool-size>
                <max-pool-size>20</max-pool-size>
                <flush-strategy>FailingConnectionOnly</flush-strategy>
            </pool>
            <security>
                <user-name>slon</user-name>
                <password>slon</password>
            </security>
            <validation>
                <validate-on-match>false</validate-on-match>
                <background-validation>false</background-validation>
            </validation>
            <timeout>
                <idle-timeout-minutes>10000</idle-timeout-minutes>
            </timeout>
            <statement>
                <share-prepared-statements>
                    false
                </share-prepared-statements>
            </statement>
        </datasource>
    </datasources>
</subsystem>

Параметры настройки DataSource :

  • connection-url — строка подключения к серверу БД;
  • driver-class — класс JDBC драйвера;
  • driver — наименование драйвера;
  • pool — настройки пула соединений
  • min-pool-size — минимальный размер пула
  • max-pool-size — максимальный размер пула
  • security — настройки аутентификации
  • user-name — имя пользователя БД
  • password — пароль

После старта JBoss (сервер Oracle также запущен) в консоли должна появиться следующая информация :


11:13:50,604 INFO  [org.jboss.as.connector.subsystems.datasources] \
      ServerService Thread Pool -- 27) JBAS010403: Deploying \
      JDBC-compliant driver class oracle.jdbc.OracleDriver (version 11.2)
11:13:53,163 INFO  [org.jboss.as.connector.subsystems.datasources] \
      (MSC service thread 1-1) JBAS010400: 
      Bound data source [java:jboss/datasources/slon]
 
  Рейтинг@Mail.ru