Пятая статья в серии? посвященной созданию web приложения с использованием технологии Java EE. В данной статье мы создадим и наполним содержимым базу данных создаваемого нами сайта, познакомимся с веб-консолью нашего GlassFish сервера и с ее помощью создадим jdbc соединение, а так же настроим pool соединений с базой данных.
В разработке нашего веб-приложения мы подошли к точке, после которой движение дальше без базы данных невозможно. Как было сказано ранее, при реализации примеров статей используется СУБД MySQL. Нюансы её установки на Ubuntu были описаны во второй статье.
Создание базы данных
Автором была создана самая простая схема базы данных "myblog", которая позволяла бы реализовывать необходимые функции приложения. В реальных проектах она будет безусловно намного сложнее.
Для удобной работы с базой данных: создания базы данных и таблиц, редактирования, мониторинга и прочего, рекомендую использовать разработку компании Oracle специально для таких целей MySQL Workbench.
Схема базы данных представлена на рисунке ниже:
Очень важно чтобы таблицы users и groupusers были реализованы именно так, как показано на схеме. Вы можете добавить дополнительные сущности в таблицу, но не удалять существующие и не изменять связи. Это необходимо для реализации технологии JAAS при создании функционала авторизации и распределения прав доступа.
Таблицы groupusers и articles имеют связь многие ко многим, это также необходимо для демонстрации возможности JPA.
Листинг создания базы данных приведен ниже.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
CREATE SCHEMA IF NOT EXISTS `myblog` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `myblog` ;
-- -----------------------------------------------------
-- Table `myblog`.`articles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `myblog`.`articles` (
`id` INT NOT NULL AUTO_INCREMENT ,
`title` VARCHAR(45) NOT NULL COMMENT 'Заголовок статьи' ,
`text` TEXT NOT NULL COMMENT 'Текст статьи' ,
`date` TIMESTAMP NOT NULL DEFAULT now() COMMENT 'Дата добавления статьи.' ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `title_UNIQUE` (`title` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
-- -----------------------------------------------------
-- Table `myblog`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `myblog`.`users` (
`login` VARCHAR(15) NOT NULL COMMENT 'Логин' ,
`pass` VARCHAR(45) NOT NULL COMMENT 'Пароль' ,
PRIMARY KEY (`login`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
-- -----------------------------------------------------
-- Table `myblog`.`groupuser`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `myblog`.`groupuser` (
`name` VARCHAR(20) NOT NULL COMMENT 'Наименование группы' ,
`users_login` VARCHAR(15) NOT NULL COMMENT 'Вторичный ключ от таблицы users' ,
PRIMARY KEY (`name`) ,
INDEX `fk_groupuser_users` (`users_login` ASC) ,
CONSTRAINT `fk_groupuser_users`
FOREIGN KEY (`users_login` )
REFERENCES `myblog`.`users` (`login` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
-- -----------------------------------------------------
-- Table `myblog`.`messages`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `myblog`.`messages` (
`id` INT NOT NULL ,
`text` VARCHAR(255) NOT NULL COMMENT 'Текст сообщения' ,
`date` TIMESTAMP NOT NULL DEFAULT now() COMMENT 'Дата мессаги' ,
`users_login` VARCHAR(15) NOT NULL COMMENT 'Юзер пославший мессагу' ,
`articles_id` INT NOT NULL COMMENT 'Статье к которой послан комент' ,
PRIMARY KEY (`id`) ,
INDEX `fk_messages_users1` (`users_login` ASC) ,
INDEX `fk_messages_articles1` (`articles_id` ASC) ,
CONSTRAINT `fk_messages_users1`
FOREIGN KEY (`users_login` )
REFERENCES `myblog`.`users` (`login` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_messages_articles1`
FOREIGN KEY (`articles_id` )
REFERENCES `myblog`.`articles` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
-- -----------------------------------------------------
-- Table `myblog`.`groupuser_has_articles`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `myblog`.`groupuser_has_articles` (
`groupuser_name` VARCHAR(20) NOT NULL ,
`articles_id` INT NOT NULL ,
PRIMARY KEY (`groupuser_name`, `articles_id`) ,
INDEX `fk_groupuser_has_articles_articles1` (`articles_id` ASC) ,
INDEX `fk_groupuser_has_articles_groupuser1` (`groupuser_name` ASC) ,
CONSTRAINT `fk_groupuser_has_articles_groupuser1`
FOREIGN KEY (`groupuser_name` )
REFERENCES `myblog`.`groupuser` (`name` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_groupuser_has_articles_articles1`
FOREIGN KEY (`articles_id` )
REFERENCES `myblog`.`articles` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Или можете скачать скрипт файлом отсюда.
Выполнить его можете любым спосом по вашему вкусу. Самый быстрый - с использованием командной строки/термина, выполнив команду:
mysql -u root -p <myblog.sql
После успешного ввода пароля скрипт выполнится. Признак успешного выполнения скрипта - отсутствие сообщений в окне терминала после завершения работы скрипта.
Теперь необходимо наполнить созданную нами базу данных. Скрипт с Insert'ами можно скачать здесь. Выполнить данный скрипт можно алогично предыдущему.
Web-консоль администрирования сервера. Создание соединений с базой данных
Пришло время познакомить наш сервер с базой данных. Для этого нам необходимо создать пул соединений.
Пул соединений (Connecting Pool) содержит группу многоразовых соединений для конкретной базы данных. Поскольку при создании каждого нового физического соединения отнимается много времени, сервер поддерживает пул доступных соединений для увеличения производительности. Когда приложение запрашивает соединение, оно получает одно из соединений. При закрытии соединения, оно возвращается в пул. Подключение пула использует драйвер JDBC для создания физического соединения с базой данных.
Источник данных (так называемый ресурс JDBC) предоставляет приложениям средства подключения к базе данных. Приложения получают соединение с базой данных из пула соединений путем поиска источника данных с помощью Java Naming и Directory Interface (JNDI), а затем запрашивают соединение. Пул соединений, связанных с источником данных обеспечивает соединение для приложений.
JDBC (Java DataBase Connectivity) — платформенно-независимый промышленный стандарт взаимодействия Java-приложений с различными СУБД. Он состоит из множества классов и интерфейсов, написанных на языке Java. JDBC предоставляет стандартный API для разработчиков, использующих базы данных (далее БД). С помощью JDBC можно писать приложения на языке Java, использующие БД.
Реализовать пул соединений можно различными способами. Можно воспользоваться мастером по созданию пула предоставляемый IDE NetBeans или в ручную добавить описание ресурсов в дескриптер развертывания. Мы пойдем третьим способом, будем использовать веб-консоль сервера, заодно с ней и познакомимся.
Чтобы попасть в веб-консоль необходимо с запущеным сервером обратиться к порту 4848, например localhost:4848. После загрузки консоли, если Вы воспользовались советами из статьи 2 по настройке сервера, перед Вами должно быть окно входа в консоль.
Введите логин и пароль, созданный на этапе настройки сервера. Если пароль не назначен, то Вы сразу попадаете в консоль администрирования.
Можете ознакомиться с консолью, используя меню слева. Нас сейчас интересует позиция Resources. В ней подменю JDBC.
Для создания пул соединения кликните по меню JDBC Connection Pools, в правом окне отобразится список имеющихся пулов. Над ними есть панель, в ней необходимо нажать кнопку "New...".
Создание пула разеделено на 2 шага. В окрывшемся окне необходимо ввести имя пула и выбрать тип ресурса. Введите следующие данные:
- Pool Name: myblogPool
- Resourse Type: javax.sql.DataSource или javax.sql.ConnectonPoolDataSource
Перейдите к следующему шагу "Next", здесь в первую очередь необходимо ввести имя класса:
- Datasource Classname: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
Ниже следуют различные настройки соединения, такие как "минимальное/максимальное количество пулов", "Время таймаута и ожидания". Их можно оставить как есть.
В самом низу страницы находится панель добавления свойств пулу. Нужно добавить три свойства (используйте кнопку "New.."):
- URL: jdbc:mysql://localhost:3306/myblog
- Password: %ваш_пароль_от_базы_данных%
- User: root <Или любой другой имеющий права к базе myblog>
В свойстве URL мы указали путь, по которому сервер должен искать базу данных. По умолчанию она устанавливается на порт 3306.
Дело осталось за малым, создать jdbc ресурс. Переходим в меню JDBC Resource и жмем кнопку "New...". Введите имя jdbc ресурс и выберите только что созданный пул:
- JNDI Name: jdbc/myblog
- Pool Name: myblogPool
Теперь вернемся в меню JDBC Connection Pool и выберим наш вновь созданный пул. Чтобы проверить его работоспособность нажмите на кнопку Ping, в случае успеха появится следующие сообщение:
Если пинг не прошел успешно, возможны следующие причины:
- Не правильно указан путь к базе данных.
- Не найден драйвер. В этом случае нужно скачать драйвер с сайта MySQL. Из архива извлечь jar файл и скопировать его в папку lib сервера. После этого перезагрузите сервер.
Пул готов. В следующей статье преступим к самому интересному, создадим классы сущности и сессионные компоненты, познакомимся с нотациями, благодаря которым упрощается настройка компонентов, и выведем статьи на главную страницу с использованием технологии JSTL.
Комментарии
scajite pojalyjsta, kak polychit' sckript dlja sozdanija bazi dannih
Прошу прощения за поздний ответ. Если еще кому актуально, то файл дампа структуры БД лежит сдесть http://onedeveloper.ru/upload/myblog.sql
Спасибо, просто , огромное. Сам нуб, мучился с этим пулом, пытаясь созать по документации на сайте NetBeans. Ничего не выходило. Нашел в баг-треккере в коментариях, что вываливается ошибка при попытках создать пул в веб-консоли на версиях сервера 4.1.1, и что нужно установить версию 4.1. Сделал , но все равно в IDE что-то не получалось. С вашей статьей все получилось с первого раза.
вот сообщение о этой ошибке
https://java.net/jira/browse/GLASSFISH-21443
Присоединюсь, огромное Вам спасибо, всё получилось!
И у меня тоже была ошибка при создании пула соединения, проблема в версии сервера 4.1.1, когда поставил 4.1 всё получилось
SKAJITE POJALUYSTA KAK SDELAT' PING S SERVEROM ESLI DAZHE POSLE PROBRASIVANIYA V PAPKU ON NE PROHODIT???