Статья 'Технологии подключения к базе данных из JSP-страниц и сервлетов веб-приложений Java' - журнал 'Кибернетика и программирование' - NotaBene.ru
по
Меню журнала
> Архив номеров > Рубрики > О журнале > Авторы > О журнале > Требования к статьям > Редакция и редакционный совет > Порядок рецензирования статей > Политика издания > Ретракция статей > Этические принципы > Политика открытого доступа > Оплата за публикации в открытом доступе > Online First Pre-Publication > Политика авторских прав и лицензий > Политика цифрового хранения публикации > Политика идентификации статей > Политика проверки на плагиат
Журналы индексируются
Реквизиты журнала

ГЛАВНАЯ > Вернуться к содержанию
Кибернетика и программирование
Правильная ссылка на статью:

Технологии подключения к базе данных из JSP-страниц и сервлетов веб-приложений Java

Грибанова-Подкина Мария Юрьевна

кандидат физико-математических наук

доцент, Балашовский институт (филиал), ФГБОУ ВО «Саратовский национальный исследовательский государственный университет им. Н.Г. Чернышевского»

412300, Россия, Саратовская область, г. Балашов, ул. Карла Маркса, 29

Gribanova-Podkina Maria

PhD in Physics and Mathematics

Associate Professor, Department of Physics and Information Technology, Balashov Institute (branch) of the Chernyshevsky National Research Saratov State University

412300, Russia, Saratovskaya oblast', g. Balashov, ul. Karla Marksa, 29

m.gribanova-podkina@rambler.ru
Другие публикации этого автора
 

 

DOI:

10.25136/2644-5522.2019.2.19589

Дата направления статьи в редакцию:

28-06-2016


Дата публикации:

27-05-2019


Аннотация: Целью исследования является демонстрация многообразия решений по вопросу соединения с базой данных, включая описание разработанного класса контроллера подключения, а также различных способов создания пулов соединений на веб-сервере и серверах приложений. В статье рассматриваются практические вопросы использования технологии JDBC при построении веб-приложения Java. В приведенных примерах презентационный и бизнес-слой приложения разрабатываются с помощью JSP-страниц и сервлетов, база данных функционирует на платформе MySQL. Описываемые способы создания и настройки пула соединений приведены на примере веб-сервера ApacheTomcat и сервера приложений GlassFish. Вопрос оптимизации соединений с базой данных в приложениях Java остается открытым, несмотря на многообразие решений. В исследовании рассматриваются и предлагаются методы построения классов-коннекторов, различные способы создания пулов соединений, а также описываются результаты решения проблем, возникающих при реализации описанных методик. Приведена развернутая классификация способов соединения с базой данных.


Ключевые слова:

веб-приложение, база данных, JDBC, пул соединений, веб-сервер, сервер приложений, MySQL, GlassFish, контроллер подключения, источник данных

Abstract: The purpose of the study is to demonstrate the diversity of solutions on the issue of connecting to a database, including a description of the developed connection controller class, as well as various ways to create connection pools on a web server and application servers. The article discusses the practical issues of using JDBC technology when building a Java web application. In the examples, the presentation and business layer of the application are developed using JSP-pages and servlets, the database operates on the MySQL platform. The described methods for creating and configuring a connection pool are shown on the example of the ApacheTomcat web server and the GlassFish application server. The question of optimizing database connections in Java applications remains open, despite the diversity of solutions. The study examines and proposes methods for constructing classes of connectors, various methods for creating pool connections, and describes the results of solving problems arising from the implementation of the described techniques. A detailed classification of ways to connect to the database is given.


Keywords:

web application, database, JDBC, connection pool, web server, application server, MySQL, GlassFish, connection controller, data source

Введение

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

Для работы с базой данных в Java используется интерфейс Connection, с помощью которого клиентское приложение осуществляет обращение к объектам базы данных, оправляя сообщения и получая результаты. Дескриптор соединения, являющийся объектом типа Connection, может быть получен двумя основными способами:

  • с использованием класса DriverManager, когда устанавливается физическое соединение с базой данных;
  • с использованием интерфейса DataSourse, когда связь с базой данных осуществляется посредством источника данных.

Интерфейс DataSourse был введен в JDBC 2.0 Optional Package API и позволяет обобщать спецификацию ресурса базы данных. В отличие от DriverManager, требующего подробного описания всех деталей соединения, DataSourse скрывает детали реализации, оперируя логическими именами.

Рассмотрим оба варианта создания дескриптора соединения с базой данных и области использования приведенных способов.

Подключение к базе данных

Начальный этап разработки веб-приложения, которое построено на взаимодействии с базой данных, включает в себя процесс подключения к базе данных. Этот процесс, основанный на использовании класса DriverManager, согласно технологии JDBC, включает в себя следующие моменты:

  • загрузка драйвера JDBC для нужной базы данных;
  • формирование строки подключения (JDBC-URL);
  • создание подключения и получение его идентификатора.

Самым простым вариантом будет установка этого соединения в скрипте прямо на странице.

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

В приведенном ниже фрагменте кода (см. листинг 1) на JSP-странице описаны также следующие объекты:

  • типа Statement, определяющий предложение (запрос) к базе данных;
  • типа ResultSet, представляющий собой результат запроса – курсор с выборкой.

Листинг 1. Код подключения к базе данных

l1

После подключения к базе данных и получения из нее результатов выборки всех данных из таблицы, можно вывести эти данные на странице. Таким образом, код JSP-страницы будет содержать два блока:

  • блок подключения к базе данных;
  • блок отображения или обработки данных.

Аналогично и для других JSP-страниц и сервлетов, которые будут подключаться к базе данных. Такая логика построения кода приводит к его неоправданно большому дублированию, а также сильно загромождает страницы. Не менее важен и тот факт, что создание соединения при каждом обращении к базе данных является неоптимальным в плане временных потерь на создание соединения, которые сравнимо больше того времени, которое затрачивается на обработку запроса или выполнение транзакции.

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

Разработка и использование контроллера подключения

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

Для реализации контроллера соединений с помощью рассмотренного паттерна, создаем обычный java-класс с названием ConnectBean.

Согласно принципам паттерна Singleton, определяем в классе закрытое статическое поле instance из того же класса ConnectBean, а также закрытый конструктор класса, который осуществляет подключение к базе данных. Дополнительно в классе необходимо описать поле типа Connection, которое будет хранить в себе идентификатор соединения.

Обеспечивает получение объекта класса метод getInstance(), который будет возвращать ссылку на объект, если он уже существует, или создавать объект в случае его отсутствия. Таким образом, будет гарантироваться единственность экземпляра класса-контроллера. Метод getConnection() будет возвращать идентификатор соединения (см. листинг 2).

Листинг 2. Описание класса контроллера подключения

l2

Теперь, когда обязанность по установке соединения с базой возложена на объект класса ConnectBean, можно значительно сократить скрипты на JSP-страницах. Для этого необходимо лишь получить экземпляр класса ConnectBean и применить к нему метод getConnection(). Ниже приведен код (см. листинг 3), где cоздается объект-запрос к базе данных на основе соединения из класса-синглтона ConnectBean.

Листинг 3. Измененный скрипт подключения к базе данных

l3

Таким образом, контроллер подключения к базе данных значительно сокращает код на JSP-странице, позволяя достаточно простым способом получать идентификатор соединения в любом необходимом фрагменте. Предложенный способ соединения с базой данных оправдан при использовании в веб-приложениях небольшого масштаба с ограниченным числом пользователей. Он с успехом функционирует, например, в системах, описанных в [1] и [2].

Недостатком предложенного подхода является ограничение нагрузки на соединение: в случае обращения к одному соединению большого числа клиентов будет образовываться очередь, что снова приведет к потере производительности приложения. Решение этой проблемы возможно с помощью реализации менеджера соединений, который должен реализовывать следующие функции:

  • наличие нескольких соединений с базой данных;
  • учет свободных и использующихся соединений;
  • управление процессом выдачи соединения клиенту и др.

Пример такого менеджера приведен в [3]. Идея заключается в том, что менеджер соединений оперирует с двумя списками: списком доступных и списком используемых подключений. При запросе соединения клиент либо получает его из списка доступных подключений, либо для него открывается новое соединение, которое переносится в список используемых. После освобождения клиентом соединение снова возвращается в список доступных.

Фактически, представленная схема является упрощенным вариантом пула соединений.

Использование пула соединений

Рассмотренные варианты управления соединениями с базой данных основывались на использовании класса DriverManager, который создавал соединения с помощью статического метода getConnection(). Альтернативным вариантом является использование интерфейса DataSourse.

Интерфейс DataSource предоставляет возможность получения соединения с базой данных, абстрагируясь от местоположения сервера СУБД и типа драйвера конкретного производителя. Объект типа DataSource может создаваться в приложении или на сервере. Доступ к нему осуществляется через службу Java Naming и Directory Interface (JNDI). Используя класс контекста InitialContext, компонент приложения может найти нужный ресурс. Класс контекста InitialContext предоставляет доступ к окружению идентификации приложения. Следующий код показывает, как можно использовать объекты типа DataSource для соединений из JSP-страниц, развернутых в веб-сервере или сервере приложений J2EE (см. листинг 4).

Листинг 4. Соединение с базой данных, основанное на DataSource

l4

Текст java:comp/env в составе параметра задает, что метод lookup должен осуществлять поиск ресурса в записях окружения компонента приложения (т.е. в списке имен ресурсов, задаваемых при развертывании). Текст jdbc/myTest задает, что ресурс представляет собой источник данных JDBC под именем myTest. Естественно, что этот ресурс должен быть предварительно описан и развернут на веб-сервере или сервере приложений.

Однако обычная реализация интерфейса DataSource также позволяет устанавливать лишь одно соединение с источником данных, что приводит к тем же проблемам в потере производительности, которые были рассмотрены выше. При этом реализация интерфейса DataSourse позволяет использовать принципиально другой подход к оперированию соединениями, который основан на реализации пула соединений.

Концепция пула соединений основана на следующих положениях:

  • наличие нескольких соединений с базой данных;
  • управление процессом выдачи соединений клиентам: выдается свободное соединение, а при его отсутствии создается новое;
  • управление процессом возврата соединения в пул;
  • отслеживание длительно невостребованных соединений и их закрытие.

Таким образом, пул соединений берет на себя роль управления жизненным циклом соединений.

В Java имеется стандартизированная концепция пула соединений в JDBC. Дополнительные интерфейсы и все основные серверы приложений имеют реализации этих интерфейсов.

Рассмотрим решения для реализации пула соединений, предлагаемые основными серверами, на примере соединения с базой данных MySQL, которая доступна на локальном хосте по адресу localhost:3306/test.

Веб-сервер Apache Tomcat предлагает следующее решение для создания пула:

1) объявление нового ресурса в контексте приложения – файл context.xml. Минимально необходимые настройки приведены на листинге 5.

Листинг 5. Настройка ресурса в файле context.xml

l5

2) добавление ссылки на этот ресурс в дескриптор развертывания приложения web.xml (см. листинг 6).

Листинг 6. Настройка ресурса в файле web.xml

l6

После этих настроек пул соединений становится доступным для подключения к базе данных из JSP-страниц и сервлетов с помощью кода, приведенного на листинге 4. Исчерпывающая документация по настройке, развертыванию и использованию пула соединение на сервере Apache Tomcat представлена в [4].

Настройка пула соединений в консоли администратора сервера приложений

Схема настройки и реализации пула соединений для серверов приложений состоит в следующем:

  1. создание пула соединений;
  2. создание ресурса, связанного с пулом соединений.
  3. добавление ссылки на ресурс в дескриптор развертывания приложения web.xml.

Таким образом, в отличие от веб-сервера Apache Tomcat, необходима настройка двух элементов: и пула, и ресурса. Все серверы приложений имеют стандартизованное решение по этому поводу, которое реализуется с помощью консоли администратора. Рассмотрим его на примере сервера приложений GlassFish 4. Приведенный ниже способ создания пула менее детально описан также в [5].

Информация о существующих пулах соединений находится в ветке Resources/ JDBC/ JDBC Connection Pools (см. рис. 1). Создание нового пула осуществляется на этой же странице с помощью кнопки New.

1_

Рисунок 1. Обзор пулов соединения в консоли администратора сервера приложений GlassFish

Создается новый пул соединений в два этапа. На первом указывается имя пула, выбирается тип ресурса и поставщик базы данных (см. рис. 2). В приведенном примере выбран тип ресурса java.sql.ConnectionPoolDataSource и база данных MySQL.

2

Рисунок 2. Создание пула. Шаг 1

Тип ресурса выбирается, исходя из требований к транзакциям, и может быть следующим [6]:

  • javax.sql.DataSource – поддерживаются только локальные транзакции;
  • javax.sql.XADataSource – поддержка глобальных транзакций;
  • java.sql.ConnectionPoolDataSource – локальные транзакции, возможные улучшения производительности.

На втором этапе создания пула устанавливаются его основные и дополнительные свойства (см. рис. 3). К основным относятся, например, минимальный и максимальный размер пула (количество соединений), время простоя, максимальное время ожидания соединения.

3

Рисунок 3. Создание пула. Шаг 2

Из дополнительных свойств минимально необходимыми являются URL (JDBC-URL) базы данных, имя пользователя и пароль для подключения (см. рис. 4). Эти свойства могут быть установлены на этапе создания пула, либо изменены во время редактирования уже созданного пула.

4

Рисунок 4. Установка дополнительных свойств пула

После рассмотренных действий по созданию пула, он будет отображаться в общем списке пулов (см. рис. 5) и может быть доступен из любого приложения, разворачиваемого на сервере приложений.

5

Рисунок 5. Список пулов

Для доступа к пулу остается создать связанный с ним ресурс. Это делается в соседней ветке Resources/ JDBC/ JDBCResources. При создании ресурса указывается его имя, связанный пул и дается описание ресурса (см. рис. 6).

6

Рисунок 6. Создание ресурса, связанного с пулом

Теперь можно добавлять ссылку на ресурс jdbc/myTest в дескриптор развертывания приложения (см. листинг 6) и осуществлять соединение с базой данных через пул с помощью скрипта, приведенного на листинге 4.

Альтернативные способы создания пула соединений для сервера приложений

Для рассмотренного сервера приложений GlassFish существуют альтернативные способы создания пула соединений. Например, возможно создание пула из командной строки операционной системы с помощью команды серверу GlassFish:

  • команда asadmincreate-jdbc-connection-pool создает пул соединений JDBC;
  • команда asadmincreate-jdbc-resource создает JDBC-ресурс, связанный с пулом соединений.

Пример команды по созданию пула соединений приведен ниже на листинге 7.

Листинг 7. Создание пула из командной строки

asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jbdc.jbdc2.optional.MysqlConnectionPoolDataSource --restype javax.sql.ConnectionPoolDataSource --property user=root:password=root:url=jdbc:mysql://localhost:3306/test TestPoolMySQL

Пример команды по созданию связанного с пулом ресурса приведен на листинге 8.

Листинг 8. Создание ресурса из командной строки

asadmin create-jdbc-resource --connectionpoolid TestPoolMySQL jdbc/myTest

В [7] предложен способ создания пула в интегрированной среде разработки NetBeans средствами самой среды. С этой целью в приложении создается файл glassfish-resources.xml с описанием пула. Для создания файла и описания конфигурации пула используется диалог создания файла Пул соединений JDBC из категории GlassFish (см. рис. 7).

7

Рисунок 7. Создание файла с описанием пула в среде NetBeans. Шаг 1

Далее необходимо указать название пула и строку подключения к базе данных, которую можно извлечь из существующего подключения, уже настроенного в среде (см. рис. 8), либо указать новую строку подключения.

8

Рисунок 8. Создание файла с описанием пула в среде NetBeans. Шаг 2

После этого достаточно выбрать имя класса источника данных, тип ресурса и задать свойства подключения (см. рис. 9).

9

Рисунок 9. Создание файла с описанием пула в среде NetBeans. Шаг 3

Создание связанного с пулом ресурса осуществляется также интерактивно с помощью вызова диалога создания файла Ресурсы JDBC из категории GlassFish. В настройках необходимо указать нужный пул и JNDI-имя ресурса (см. рис. 10).

10

Рисунок 10. Создание связанного с пулом ресурса в среде NetBeans. Шаг 3

Описанные действия ведут к созданию двух секций в файле настроек glassfish-resources.xml:

  • секция jdbc-resource, соответствующая ресурсу, по которому будет осуществляться доступ к соединению;
  • секция jdbc-connection-pool, описывающая пул соединений.

При этом, согласно [7], пул и ресурс должны разворачиваться на сервере в процессе развертывания приложения. Однако в списке ресурсов и пулов сервера приложений они не отображаются и, соответственно, не являются доступными для приложений с помощью кода, приведенного в листинге 4. Эта проблема неоднократно поднималась в технической поддержке NetBeans [8,9], но до сих пор не исправлена. Выходом в сложившейся ситуации является поиск ресурса не в глобальном контексте java:comp/env, а в контексте приложения java:app (см. листинг 9).

Листинг 9. Подключение к базе данных с поиском ресурса в контексте приложения

l9

Это означает, что пул и ресурс разворачиваются, но не самостоятельно, а в структуре приложения. Доступ к ним может осуществляться в этом случае только из данного приложения.

Заключение

Рассмотренные и предложенные способы соединения с базой данных, осуществляемые JSP-страницами и сервлетами веб-приложений Java, можно классифицировать следующим образом:

  • простое соединение на основе класса DriverManager;
  • контроллер подключения на основе класса DriverManager, управляющий физическим соединением с базой данных;
  • менеджеры соединений на основе класса DriverManager, управляющие несколькими физическими соединениями с базой данных;
  • простое соединение на основе интерфейса DataSource, которое обращается к источнику данных по его логическому имени (JNDI), при этом физическое соединение с базой данных держит сам источник данных;
  • пул соединений с базой данных, управляющий потоками соединения с базой данных, доступ к пулу осуществляется через связанный источник данных.

Приведенные способы создания и настройки пула соединений приведены на примере веб-сервера ApacheTomcat и сервера приложений GlassFish. Настройка пула соединений на сервере приложений может осуществляться в консоли администратора, из командной строки, а также средствами интегрированных сред разработки (в приведенном примере – NetBeans).

Дополнительно необходимо отметить, что в противовес «коробочным» реализациям пулов соединений от разработчиков серверов приложений существуют и альтернативные способы. Они представляют собой библиотеки пулов для Java, которые разрабатываются вендорами БД (например, Oracle [10]) и сторонними поставщиками, где наиболее популярными являются DBCP [11] от Apache Software Foundation, HikariCP [12] и c3p0 [13]. Такое многообразие решений говорит об актуальности вопроса оптимизации соединений с базой данных в приложениях Java и позволяет констатировать, что задача создания пула, отвечающего всем требованиям разработчика, до сих пор остается открытой.

Библиография
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
References
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.

Результаты процедуры рецензирования статьи

В связи с политикой двойного слепого рецензирования личность рецензента не раскрывается.
Со списком рецензентов издательства можно ознакомиться здесь.

Предмет исследования, представленный в статье, имеет определенный, практико-ориентированный научный интерес - в статье рассматриваются практические вопросы использования технологии JDBC при построении веб-приложения Java.
Методы, которыми оперировал автор, позволили ему раскрыть заявленную тему в полном объеме, так как описываемые способы создания и настройки пула соединений приведены на примере веб-сервера ApacheTomcat и сервера приложений GlassFish.
Исследование может вызвать большой научный, а, скорее, даже практический интерес у читателей журнала, так как вопрос оптимизации соединений с базой данных в приложениях Java остается открытым, несмотря на многообразие решений, а практика применения веб-приложения Java, показывает на практике довольно частые сбои.
Статья содержит элементы научной новизны, отражающихся в выводах, которые, в частности, позволяют ему рассмотреть и предложить методы построения классов-коннекторов, различные способы создания пулов соединений, а также описать результаты решения проблем, возникающих при реализации описанных методик при использовании Java.
Текст статьи характеризуется логичностью, последовательностью, ясностью. Используется лексика научного стиля.
Библиография статьи содержит большое число ссылок на научные работы по схожей тематике исследования, а наличие рисунков- скриншотов и визулизированных листингов позволяет автору наглядно представить материал.
Представленный автором обзор работ других исследователей по схожей тематике, в достаточной мере дает представление о текущем состоянии рассматриваемой научной проблемы. В тоже время возможно наличие самоцитирования.
Выводы автора статьи имеют под собой строгую научную основу. Мысли сформулированы ясно и изложены логично, а также оформлены в отдельную рубрику "Заключение".
Ссылка на эту статью

Просто выделите и скопируйте ссылку на эту статью в буфер обмена. Вы можете также попробовать найти похожие статьи


Другие сайты издательства:
Официальный сайт издательства NotaBene / Aurora Group s.r.o.