Причины отказа от Hibernate и как правильно использовать JDBC



Стаття | Article    

Download

В данном докладе ведется короткий экскурс по технологиям JDBC и Hibernate, где приводятся сравнительные характеристики, а также перечисляются их достоинства и недостатки. Особое внимание уделяется разработанной технологии MySQL-wrapper:описание и обоснование ее необходимости. Также прилагаются материалы тестирования трех технологии при разных нагрузках, после которых сделаны выводы.

Доклад состоит из одного раздела, содержит 6 страниц, 3 таблицы, 1 рисунок, 7 источников.

Ключевые слова: СОЕДИНЕНИЕ С БАЗАМИ ДАННЫХ НА JAVA, HIBERNATE, СИСТЕМА УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ, ОБЪЕКТНО-РЕЛЯЦИОННОЕ ОТОБРАЖЕНИЕ, MYSQL, JAVA.

Reasons for not using Hibernate and how to use JDBC correctly

The reportconsists of one section, contains 6 pages, 3 tables, 1 picture, 7 sources.

This reportincludes short excursion on JDBC and Hibernate technologies, where comparativecharacteristics are given and their advantages and disadvantages are listed.Special attention is paid to the developed MySQL-wrapper: description andjustification of its necessity are given below. Also testing materials of threetechnologies at different loads were included, after which conclusions are made.

JAVA DATABASECONNECTIVITY, HIBERNATE, DATABASE MANAGEMENT SYSTEM, OBJECT-RELATIONAL MAPPING, MYSQL, JAVA.

Shyshkin Vladysav Igorovych

Sukhaniuk Maryna Valentynivna

students of faculty of informatics and computer technology

National Technical University of Ukraine

“Igor Sikorsky Kyiv Polytechnic Institute”

Kyiv, Ukraine

На сегодняшний день, очень сложно найти разработчика, который бы при программировании приложений, не работал с базами данных. Потому, для упрощения взаимодействия с СУБД начали писаться различные фреймворки [3]. JDBC (Java DataBase Connectivity) является платформенно-независимым промышленным стандартом взаимодействия Java-приложений с различными СУБД, реализованным в виде пакета java.sql, входящего в состав Java SE [1]. После этого стали появлятьсяORM-решения, которые упрощали взаимодействия с базой данных и объектами Java.ORM (Object-relational mapping) позволяет заносить, получать, изымать данные из базы данных. ORM-решением для языка Java, является технология Hibernate, которая помогает сэкономить значительную часть времени при построении запросов и извлечении данных.

Однако, существует множество споров на тему, что лучше использовать при разработке проектов: JDBC или Hibernate. Данное сравнение нельзя назвать верным, посколькуHibernate - это оболочка для JDBC, которая обладает огромным набором функций и возможностей.

Hibernate имеет целый ряд преимуществ, которые являются решающими при выборе данной технологии.

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

$2)$ Hibernateподдерживает XML так же как и JPA аннотации, что позволяет сделать реализацию кода независимой.

$3)$ Hibernateпредоставляет собственный мощный язык запросов (HQL), который похож наSQL. Стоит отметить, что HQL полностью объектно-ориентирован и понимает такие принципы, как наследование, полиморфизм и ассоциации (связи).

$4)$ Hibernate— широко распространенный open source проект. Благодаря этому доступны тысячи открытых статей, примеров, а так же документации по использованию фреймворка.

$5)$ Hibernateподдерживает ленивую инициализацию используя proxy объекты и выполняет запросы к базе данных только по необходимости.

$6)$ Hibernateподдерживает разные уровни cache, а, следовательно, может повысить производительность.

$7)$ Важно,что Hibernate может использовать чистый SQL, а, значит, поддерживает возможность оптимизации запросов и работы с любым сторонним вендором БД и его возможностями [6].

$8)$ Лёгкость разработки: разработчик может не знать специфики базы данных, с которой работает.

Однако, далеко не все разработчики являются поклонниками Hibernate или JDBC. Большинство компаний склоняются к использованию различных ORM для ускорения работы. Важным недостатком является то, что использование Hibernate ускорит роботу, но при этом замедлит приложение.

Каковы же основные причины отказа от Hibernate и JDBC без оболочки? В таблице 1 наведены основные данные по этому поводу.

Таблица 1 – Причины отказа от Hibernate и JDBC

Таким образом, для разработки нашего проекта, было решено использовать свой собственный, быстрый и небольшой ORM для работы с базой данной MySQL.

Во время разработки, первым, с чем мы столкнулись, была проблема, связанная с большими затратами при процессе открытия подключения к базе данных. В Hibernateиспользуется технология Connection Pool, которая при запуске открывает заданное количество подключений и, когда достаточно большая нагрузка, открываются дополнительные подключения. Взявши за основу вышеописанную технологию, мы решились написать собственный ConnectionPool, схема работы которого описана на рисунке 1.

Рис. 1. Схема работы Connection Pool

Как видим с рисунка 1, Connection Pool играет роль связывающего компонента между базой данный и клиентом. Что является логичным, поскольку благодаря этому компоненту есть возможность не тратить лишнее время на открытие нового подключения к базе данных, потому что несколько свободных подключений всегда будут наготове для использования.

Чтоже происходит, если Connection Pool занят?

Если есть возможность открыть еще подключения, Connection Pool автоматически создаст несколько подключений к базе данных и выполнит пользовательский запрос в новом подключении. Иначе, клиент будет ожидать, когда соединение освободится по принципу FIFO (first in first out).

Также было важно написать оболочку под JDBC. Java-класс должен иметь пустой конструктор и быть описан с помощью аннотаций, благодаря которым есть возможность построить такие запросы, как insert, delete, update, select.

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

@DBModel(tableName ="users")

public class User implementsDBEntity {

@DBField(fieldName = "id",isAutoIncrement = true)

private int id;

@DBField(fieldName = "login")

private String login;

@DBField(fieldName = "password")

private String password;

publicUser(){

}

}

С помощью аннотаций мы указываем поля и имя таблицы соответственно в базе данных. Благодаря такому подходу мы имеем возможность делать любые запросы в базу данных. Пример написания аннотаций наведен ниже.

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface DBField {

@NotNull

String fieldName();

boolean isAutoIncrement() default false;

int maxLenght() default 3;

int minLenght() default Integer.MAX_VALUE;

}

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface DBModel {

@NotNull

String tableName();

}

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

Пусть имеем выборку в базе данных с заданным количеством пользователей в таблице равным 1000. Выполняемые запросы: select, insert, delete, update. Количество клиентов(потоков), которые выполняли запросы – 5. Будем считать, что клиент уже открыл подключение к базе данных.

В таблице 2 наведено сравнение скоростей обработки запросов с помощью технологийJDBC, Hibernate, разработанного MySQL wrapper в зависимости от количества повторений запроса.

Таблица 2 – Сравнение скоростей

Как видно из таблицы 2, JDBC-технология работает быстрее двух остальных, но это происходит в том случае, когда подключение открывается один раз. То есть, клиент, открыв подключение,использует его постоянно - такой подход нельзя звать правильным. Однако, поскольку и Hibernate, и разработанный MySQL wrapper используют Connection Pool, это было бы неверным - учитывать время закрытия и открытия подключения каждый раз. Если же их сравнивать в одинаковых условиях, то есть, учитывая время подключения у всех трех технологий, или же, не учитывая ни у кого, то скорость у JDBC будет намного хуже, чем у Hibernate и разработанного фреймворка.

Как видим, на большом количестве запросов, Hibernate начинает работать в разы быстрее из-за системы кэширования. Однако, на последнем приведенном количестве повторений MySQL wrapper работает несколько быстрее, и с увеличением повторений, разница будет увеличиваться.

Ниже представлены параметры компьютера, на котором производилось тестирование.

Таблица 3 – Параметры компьютера при тестировании

Благодаря тестированию скорости работы технологии, мы можем видеть необходимость в использовании своего ORM-фреймворка, который справляется с задачей быстрее, чем Hibernate, и если учитывать время подключения для JDBC, то и быстрее последнего. Свой ORM-фреймворк является необходимым в том случае, когда приоритетом является скорость и легкость приложения. В случае же с большим проектом, где есть вероятность перехода с одной СУБД на другую, больше подойдет использование Hibernate.

Перечень ссылок

$1.$ Java Database Connectivity [Электронный ресурс] - Режим доступа к ресурсу: https://ru.wikipedia.org/wiki/Java\_Database\_Connectivity

$2.$ Hibernate [Электронный ресурс] - Режим доступа к ресурсу: https://ru.wikipedia.org/wiki/Hibernate\_\(%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0)

$3.$ JDBC - средство общения между Java и базами данных [Электронный ресурс] - Режим доступа к ресурсу: http://www.javaportal.ru/java/articles/JDBC\_java\_BD.html

$4.$ Dipti Phutela. Hibernate Vs JDBC [Электронный ресурс] / Dipti Phutela, Mindfire Solutions - Режим доступа к ресурсу: http://www.mindfiresolutions.com/mindfire/Java\_Hibernate\_JDBC.pdf.

$5.$ Hibernatevs JDBC performance [Электронный ресурс] - Режим доступа к ресурсу: http://phpdao.com/hibernate\_vs\_jdbc/

$6.$ Вопросы и ответы на собеседование по теме Hibernate Framework. Часть 1. [Электронный ресурс] – Режим доступа к ресурсу: http://javastudy.ru/interview/jee\-hibernate\-questions\-answers/

$7.$ Java Database Connectivity - Преимущества [Электронный ресурс] – Режим доступа к ресурсу: http://bourabai.kz/dbt/JDBC02.htm

Jun 12, 2017