Библиотека
|
ваш профиль |
Кибернетика и программирование
Правильная ссылка на статью:
Грибанова-Подкина М.Ю.
Технологии подключения к базе данных из JSP-страниц и сервлетов веб-приложений Java
// Кибернетика и программирование.
2019. № 2.
С. 73-85.
DOI: 10.25136/2644-5522.2019.2.19589 URL: https://nbpublish.com/library_read_article.php?id=19589
Технологии подключения к базе данных из JSP-страниц и сервлетов веб-приложений Java
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, может быть получен двумя основными способами:
Интерфейс DataSourse был введен в JDBC 2.0 Optional Package API и позволяет обобщать спецификацию ресурса базы данных. В отличие от DriverManager, требующего подробного описания всех деталей соединения, DataSourse скрывает детали реализации, оперируя логическими именами. Рассмотрим оба варианта создания дескриптора соединения с базой данных и области использования приведенных способов. Подключение к базе данных Начальный этап разработки веб-приложения, которое построено на взаимодействии с базой данных, включает в себя процесс подключения к базе данных. Этот процесс, основанный на использовании класса DriverManager, согласно технологии JDBC, включает в себя следующие моменты:
Самым простым вариантом будет установка этого соединения в скрипте прямо на странице. Существенным моментом при осуществлении подключения является возможность возникновения множества ошибок, которые нужно отслеживать. Поэтому весь код подключения должен быть заключен в защищенный блок. В приведенном ниже фрагменте кода (см. листинг 1) на JSP-странице описаны также следующие объекты:
Листинг 1. Код подключения к базе данных После подключения к базе данных и получения из нее результатов выборки всех данных из таблицы, можно вывести эти данные на странице. Таким образом, код JSP-страницы будет содержать два блока:
Аналогично и для других JSP-страниц и сервлетов, которые будут подключаться к базе данных. Такая логика построения кода приводит к его неоправданно большому дублированию, а также сильно загромождает страницы. Не менее важен и тот факт, что создание соединения при каждом обращении к базе данных является неоптимальным в плане временных потерь на создание соединения, которые сравнимо больше того времени, которое затрачивается на обработку запроса или выполнение транзакции. Для решения озвученных проблем на веб-сервере можно разместить специальный класс, который будет отвечать за соединение с базой данных. Разработка и использование контроллера подключения Итак, необходим один-единственный объект, который будет держать соединение с базой данных. Этот объект и станет контроллером подключения. Использование при разработке паттерна Singleton гарантирует, что у класса всегда будет только один экземпляр, и к нему будет предоставлена глобальная точка доступа. Для реализации контроллера соединений с помощью рассмотренного паттерна, создаем обычный java-класс с названием ConnectBean. Согласно принципам паттерна Singleton, определяем в классе закрытое статическое поле instance из того же класса ConnectBean, а также закрытый конструктор класса, который осуществляет подключение к базе данных. Дополнительно в классе необходимо описать поле типа Connection, которое будет хранить в себе идентификатор соединения. Обеспечивает получение объекта класса метод getInstance(), который будет возвращать ссылку на объект, если он уже существует, или создавать объект в случае его отсутствия. Таким образом, будет гарантироваться единственность экземпляра класса-контроллера. Метод getConnection() будет возвращать идентификатор соединения (см. листинг 2). Листинг 2. Описание класса контроллера подключения Теперь, когда обязанность по установке соединения с базой возложена на объект класса ConnectBean, можно значительно сократить скрипты на JSP-страницах. Для этого необходимо лишь получить экземпляр класса ConnectBean и применить к нему метод getConnection(). Ниже приведен код (см. листинг 3), где cоздается объект-запрос к базе данных на основе соединения из класса-синглтона ConnectBean. Листинг 3. Измененный скрипт подключения к базе данных Таким образом, контроллер подключения к базе данных значительно сокращает код на JSP-странице, позволяя достаточно простым способом получать идентификатор соединения в любом необходимом фрагменте. Предложенный способ соединения с базой данных оправдан при использовании в веб-приложениях небольшого масштаба с ограниченным числом пользователей. Он с успехом функционирует, например, в системах, описанных в [1] и [2]. Недостатком предложенного подхода является ограничение нагрузки на соединение: в случае обращения к одному соединению большого числа клиентов будет образовываться очередь, что снова приведет к потере производительности приложения. Решение этой проблемы возможно с помощью реализации менеджера соединений, который должен реализовывать следующие функции:
Пример такого менеджера приведен в [3]. Идея заключается в том, что менеджер соединений оперирует с двумя списками: списком доступных и списком используемых подключений. При запросе соединения клиент либо получает его из списка доступных подключений, либо для него открывается новое соединение, которое переносится в список используемых. После освобождения клиентом соединение снова возвращается в список доступных. Фактически, представленная схема является упрощенным вариантом пула соединений. Использование пула соединений Рассмотренные варианты управления соединениями с базой данных основывались на использовании класса DriverManager, который создавал соединения с помощью статического метода getConnection(). Альтернативным вариантом является использование интерфейса DataSourse. Интерфейс DataSource предоставляет возможность получения соединения с базой данных, абстрагируясь от местоположения сервера СУБД и типа драйвера конкретного производителя. Объект типа DataSource может создаваться в приложении или на сервере. Доступ к нему осуществляется через службу Java Naming и Directory Interface (JNDI). Используя класс контекста InitialContext, компонент приложения может найти нужный ресурс. Класс контекста InitialContext предоставляет доступ к окружению идентификации приложения. Следующий код показывает, как можно использовать объекты типа DataSource для соединений из JSP-страниц, развернутых в веб-сервере или сервере приложений J2EE (см. листинг 4). Листинг 4. Соединение с базой данных, основанное на DataSource Текст 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 2) добавление ссылки на этот ресурс в дескриптор развертывания приложения web.xml (см. листинг 6). Листинг 6. Настройка ресурса в файле web.xml После этих настроек пул соединений становится доступным для подключения к базе данных из JSP-страниц и сервлетов с помощью кода, приведенного на листинге 4. Исчерпывающая документация по настройке, развертыванию и использованию пула соединение на сервере Apache Tomcat представлена в [4]. Настройка пула соединений в консоли администратора сервера приложений Схема настройки и реализации пула соединений для серверов приложений состоит в следующем:
Таким образом, в отличие от веб-сервера Apache Tomcat, необходима настройка двух элементов: и пула, и ресурса. Все серверы приложений имеют стандартизованное решение по этому поводу, которое реализуется с помощью консоли администратора. Рассмотрим его на примере сервера приложений GlassFish 4. Приведенный ниже способ создания пула менее детально описан также в [5]. Информация о существующих пулах соединений находится в ветке Resources/ JDBC/ JDBC Connection Pools (см. рис. 1). Создание нового пула осуществляется на этой же странице с помощью кнопки New. Рисунок 1. Обзор пулов соединения в консоли администратора сервера приложений GlassFish Создается новый пул соединений в два этапа. На первом указывается имя пула, выбирается тип ресурса и поставщик базы данных (см. рис. 2). В приведенном примере выбран тип ресурса java.sql.ConnectionPoolDataSource и база данных MySQL. Рисунок 2. Создание пула. Шаг 1 Тип ресурса выбирается, исходя из требований к транзакциям, и может быть следующим [6]:
На втором этапе создания пула устанавливаются его основные и дополнительные свойства (см. рис. 3). К основным относятся, например, минимальный и максимальный размер пула (количество соединений), время простоя, максимальное время ожидания соединения. Рисунок 3. Создание пула. Шаг 2 Из дополнительных свойств минимально необходимыми являются URL (JDBC-URL) базы данных, имя пользователя и пароль для подключения (см. рис. 4). Эти свойства могут быть установлены на этапе создания пула, либо изменены во время редактирования уже созданного пула. Рисунок 4. Установка дополнительных свойств пула После рассмотренных действий по созданию пула, он будет отображаться в общем списке пулов (см. рис. 5) и может быть доступен из любого приложения, разворачиваемого на сервере приложений. Рисунок 5. Список пулов Для доступа к пулу остается создать связанный с ним ресурс. Это делается в соседней ветке Resources/ JDBC/ JDBCResources. При создании ресурса указывается его имя, связанный пул и дается описание ресурса (см. рис. 6). Рисунок 6. Создание ресурса, связанного с пулом Теперь можно добавлять ссылку на ресурс jdbc/myTest в дескриптор развертывания приложения (см. листинг 6) и осуществлять соединение с базой данных через пул с помощью скрипта, приведенного на листинге 4. Альтернативные способы создания пула соединений для сервера приложений Для рассмотренного сервера приложений GlassFish существуют альтернативные способы создания пула соединений. Например, возможно создание пула из командной строки операционной системы с помощью команды серверу GlassFish:
Пример команды по созданию пула соединений приведен ниже на листинге 7. Листинг 7. Создание пула из командной строки
Пример команды по созданию связанного с пулом ресурса приведен на листинге 8. Листинг 8. Создание ресурса из командной строки
В [7] предложен способ создания пула в интегрированной среде разработки NetBeans средствами самой среды. С этой целью в приложении создается файл glassfish-resources.xml с описанием пула. Для создания файла и описания конфигурации пула используется диалог создания файла Пул соединений JDBC из категории GlassFish (см. рис. 7). Рисунок 7. Создание файла с описанием пула в среде NetBeans. Шаг 1 Далее необходимо указать название пула и строку подключения к базе данных, которую можно извлечь из существующего подключения, уже настроенного в среде (см. рис. 8), либо указать новую строку подключения. Рисунок 8. Создание файла с описанием пула в среде NetBeans. Шаг 2 После этого достаточно выбрать имя класса источника данных, тип ресурса и задать свойства подключения (см. рис. 9). Рисунок 9. Создание файла с описанием пула в среде NetBeans. Шаг 3 Создание связанного с пулом ресурса осуществляется также интерактивно с помощью вызова диалога создания файла Ресурсы JDBC из категории GlassFish. В настройках необходимо указать нужный пул и JNDI-имя ресурса (см. рис. 10). Рисунок 10. Создание связанного с пулом ресурса в среде NetBeans. Шаг 3 Описанные действия ведут к созданию двух секций в файле настроек glassfish-resources.xml:
При этом, согласно [7], пул и ресурс должны разворачиваться на сервере в процессе развертывания приложения. Однако в списке ресурсов и пулов сервера приложений они не отображаются и, соответственно, не являются доступными для приложений с помощью кода, приведенного в листинге 4. Эта проблема неоднократно поднималась в технической поддержке NetBeans [8,9], но до сих пор не исправлена. Выходом в сложившейся ситуации является поиск ресурса не в глобальном контексте java:comp/env, а в контексте приложения java:app (см. листинг 9). Листинг 9. Подключение к базе данных с поиском ресурса в контексте приложения Это означает, что пул и ресурс разворачиваются, но не самостоятельно, а в структуре приложения. Доступ к ним может осуществляться в этом случае только из данного приложения. Заключение Рассмотренные и предложенные способы соединения с базой данных, осуществляемые JSP-страницами и сервлетами веб-приложений Java, можно классифицировать следующим образом:
Приведенные способы создания и настройки пула соединений приведены на примере веб-сервера ApacheTomcat и сервера приложений GlassFish. Настройка пула соединений на сервере приложений может осуществляться в консоли администратора, из командной строки, а также средствами интегрированных сред разработки (в приведенном примере – NetBeans). Дополнительно необходимо отметить, что в противовес «коробочным» реализациям пулов соединений от разработчиков серверов приложений существуют и альтернативные способы. Они представляют собой библиотеки пулов для Java, которые разрабатываются вендорами БД (например, Oracle [10]) и сторонними поставщиками, где наиболее популярными являются DBCP [11] от Apache Software Foundation, HikariCP [12] и c3p0 [13]. Такое многообразие решений говорит об актуальности вопроса оптимизации соединений с базой данных в приложениях Java и позволяет констатировать, что задача создания пула, отвечающего всем требованиям разработчика, до сих пор остается открытой. Библиография
1. Грибанова-Подкина М.Ю., Аннушкин А.В. Модель информационной системы учета движения товара в компьютерном магазине // Технические науки - от теории к практике: сб. ст. по матер. LVII междунар. науч.-практ. конф. № 4(52). Новосибирск: СибАК, 2016. С. 44-51.
2. Грибанова-Подкина М.Ю. UML-модель партионного учета товара для автоматизированной информационной системы // Программные системы и вычислительные методы. 2016. № 2. C. 111-123. DOI: 10.7256/2305-6061.2016.2.19271 3. Простейший Connection pool без DataSource в Java [Электронный ресурс]. URL: https://habrahabr.ru/post/229199/ (дата обращения: 30.06.2016) 4. Apache Tomcat 8 (8.0.36) - The Tomcat JDBC Connection Pool [Электронный ресурс]. URL: https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html (дата обращения: 30.06.2016) 5. Хеффельфингер Д. Java EE 7 и сервер приложений GlassFish 4 / пер. с англ. А. Н. Киселева. Москва: ДМК Пресс, 2016. 331с. 6. Sun GlassFish Enterprise Server 2.1 Administration Guide [Электронный ресурс]. URL: https://docs.oracle.com/cd/E19879-01/820-4335/ablip/index.html (дата обращения: 30.06.2016) 7. Создание простого веб-приложения с использованием базы данных MySQL [Электронный ресурс]. URL: https://netbeans.org/kb/docs/web/mysql-webapp_ru.html (дата обращения: 30.06.2016) 8. Bug 254192 - New File glassfish-resources.xml is created in WEB-INF and JSF application will not run [Электронный ресурс]. URL: https://netbeans.org/bugzilla/show_bug.cgi?id=254192 (дата обращения: 30.06.2016) 9. Bug 243034 - The file glassfish-resources.xml in project is not executed on Glassfish in order to install a jdbc pool [Электронный ресурс]. URL: https://netbeans.org/bugzilla/show_bug.cgi?id=243034 (дата обращения: 30.06.2016) 10. Connect to Oracle using a connection pool [Электронный ресурс]. URL: http://www.rgagnon.com/javadetails/java-0545.html (дата обращения: 30.06.2016) 11. The DBCP Component [Электронный ресурс]. URL: http://commons.apache.org/proper/commons-dbcp/ (дата обращения: 30.06.2016) 12. HikariCP [Электронный ресурс]. URL: https://brettwooldridge.github.io/HikariCP/ (дата обращения: 30.06.2016) 13. c3p0 - JDBC3 Connection and Statement Pooling [Электронный ресурс]. URL: http://www.mchange.com/projects/c3p0/ (дата обращения: 30.06.2016) References
1. Gribanova-Podkina M.Yu., Annushkin A.V. Model' informatsionnoi sistemy ucheta dvizheniya tovara v komp'yuternom magazine // Tekhnicheskie nauki - ot teorii k praktike: sb. st. po mater. LVII mezhdunar. nauch.-prakt. konf. № 4(52). Novosibirsk: SibAK, 2016. S. 44-51.
2. Gribanova-Podkina M.Yu. UML-model' partionnogo ucheta tovara dlya avtomatizirovannoi informatsionnoi sistemy // Programmnye sistemy i vychislitel'nye metody. 2016. № 2. C. 111-123. DOI: 10.7256/2305-6061.2016.2.19271 3. Prosteishii Connection pool bez DataSource v Java [Elektronnyi resurs]. URL: https://habrahabr.ru/post/229199/ (data obrashcheniya: 30.06.2016) 4. Apache Tomcat 8 (8.0.36) - The Tomcat JDBC Connection Pool [Elektronnyi resurs]. URL: https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html (data obrashcheniya: 30.06.2016) 5. Kheffel'finger D. Java EE 7 i server prilozhenii GlassFish 4 / per. s angl. A. N. Kiseleva. Moskva: DMK Press, 2016. 331s. 6. Sun GlassFish Enterprise Server 2.1 Administration Guide [Elektronnyi resurs]. URL: https://docs.oracle.com/cd/E19879-01/820-4335/ablip/index.html (data obrashcheniya: 30.06.2016) 7. Sozdanie prostogo veb-prilozheniya s ispol'zovaniem bazy dannykh MySQL [Elektronnyi resurs]. URL: https://netbeans.org/kb/docs/web/mysql-webapp_ru.html (data obrashcheniya: 30.06.2016) 8. Bug 254192 - New File glassfish-resources.xml is created in WEB-INF and JSF application will not run [Elektronnyi resurs]. URL: https://netbeans.org/bugzilla/show_bug.cgi?id=254192 (data obrashcheniya: 30.06.2016) 9. Bug 243034 - The file glassfish-resources.xml in project is not executed on Glassfish in order to install a jdbc pool [Elektronnyi resurs]. URL: https://netbeans.org/bugzilla/show_bug.cgi?id=243034 (data obrashcheniya: 30.06.2016) 10. Connect to Oracle using a connection pool [Elektronnyi resurs]. URL: http://www.rgagnon.com/javadetails/java-0545.html (data obrashcheniya: 30.06.2016) 11. The DBCP Component [Elektronnyi resurs]. URL: http://commons.apache.org/proper/commons-dbcp/ (data obrashcheniya: 30.06.2016) 12. HikariCP [Elektronnyi resurs]. URL: https://brettwooldridge.github.io/HikariCP/ (data obrashcheniya: 30.06.2016) 13. c3p0 - JDBC3 Connection and Statement Pooling [Elektronnyi resurs]. URL: http://www.mchange.com/projects/c3p0/ (data obrashcheniya: 30.06.2016)
Результаты процедуры рецензирования статьи
В связи с политикой двойного слепого рецензирования личность рецензента не раскрывается.
Методы, которыми оперировал автор, позволили ему раскрыть заявленную тему в полном объеме, так как описываемые способы создания и настройки пула соединений приведены на примере веб-сервера ApacheTomcat и сервера приложений GlassFish. Исследование может вызвать большой научный, а, скорее, даже практический интерес у читателей журнала, так как вопрос оптимизации соединений с базой данных в приложениях Java остается открытым, несмотря на многообразие решений, а практика применения веб-приложения Java, показывает на практике довольно частые сбои. Статья содержит элементы научной новизны, отражающихся в выводах, которые, в частности, позволяют ему рассмотреть и предложить методы построения классов-коннекторов, различные способы создания пулов соединений, а также описать результаты решения проблем, возникающих при реализации описанных методик при использовании Java. Текст статьи характеризуется логичностью, последовательностью, ясностью. Используется лексика научного стиля. Библиография статьи содержит большое число ссылок на научные работы по схожей тематике исследования, а наличие рисунков- скриншотов и визулизированных листингов позволяет автору наглядно представить материал. Представленный автором обзор работ других исследователей по схожей тематике, в достаточной мере дает представление о текущем состоянии рассматриваемой научной проблемы. В тоже время возможно наличие самоцитирования. Выводы автора статьи имеют под собой строгую научную основу. Мысли сформулированы ясно и изложены логично, а также оформлены в отдельную рубрику "Заключение". |