Для чего нужен drivermanager jdbc

Руководство JDBC TM

3.1 Обзор

3.1.1 Отслеживание доступных драйверов

/.hotjava/properties (HotJava загружает его при запуске в системные свойства):

Первый же вызов метода класса DriverManager повлечет за собой загрузку и регистрацию этих драйверов.

С целью обоспечения безопасности уровень управления JDBC отслеживает, каким загрузчиком классов (class loader) загружен каждый драйвер. Для открытия соединений используются только драйверы, поступившие либо из локальной файловой системы, либо загруженные тем же загрузчиком, которым загружен код, запросивший соединение с БД.

3.1.2 Установление соединения

Иногда может оказаться, что открыть соединения согласно данному URL могут более одного драйвера JDBC. В этом случае важен порядок, в котором происходит этот опрос, так как DriverManager будет использовать первый драйвер, откликнувшийся на URL.

Сначала DriverManager пробует все драйверы в порядке регистрации (драйверы, перечисленные в jdbc.drivers всегда загружаются первыми). Он пропускает драйверы, которым он не доверяет, то есть те, которые загружены из источника, отличного от кода, который пытается открыть соединение.

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

Следующий код демонстрирует соединение с мостом JDBC-ODBC:

Источник

На этот раз я хотел бы уделить внимание работе с базами данных с помощью JDBC API.

Спор под названием Hibernate (точнее JPA) против JDBC оставим в стороне. Оба подхода имеют право на существование. Если хотите услышать мое личное мнение по этому поводу, то загляните в конец статьи.

А сейчас давайте рассмотрим следующие вопросы:

DriverManager и JDBC Driver

Во всех примерах подключения к базе данных в Интернете вы обязательно встретите эти строки:

Обычно на этом повествование про драйвер и DriverManager заканчивается. Ну а мы копнем чуть глубже.

Все основные сущности в JDBC API, с которыми вам предстоит работать, являются интерфейсами:

JDBC драйвер конкретной базы данных как раз и предоставляет реализации этих интерфейсов.

Так а зачем же вызов Class.forName()?

Если посмотреть исходный код реализации любого драйвера он будет содержать статический блок инициализации такого вида:

Вызов Class.forName загружает класс и этим гарантирует выполнение статического блока инициализации, а значит и регистрацию драйвера в DriverManager.

Соединение к базе данных

В статье я предлагаю воспользоваться легковесной базой данных, написанной на Java, под названием H2 Database. В данный момент для нас преимущество ее использования состоит в том, что скачав джарку здесь вы получаете сразу и саму базу данных, и драйвер для подключения к ней, что для обучения очень удобно.

Подробнее об H2 я обязательно расскажу в отдельной статье, а пока что создадим соединение к базе данных:

Таким образом, мы получили реализацию интерфейса java.sql.Connection для нашей базы данных.

Полный код всех примеров можно найти в конце статьи.

Используем Statement и ResultSet

На основании соединения можно получить объект java.sql.Statement для выполнения запросов к базе.

В результате выполнения этого фрагмента кода будет создана таблица user с двумя колонками id и name.

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

Объекты Connection, Statement и ResultSet после использования необходимо закрывать. Поэтому приведенный выше код необходимо обернуть в try-finally и в блоке finally добавить закрытие ресурсов:

Выглядит не очень красиво, не правда ли. Закрытие ResultSet можно убрать, ведь в соответствии с контрактом:

A ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results.

Но все равно не то.

С приходом Java 1.7 ситуация немного изменилась в лучшую сторону, так как была добавлена конструкция try-with-resources, которая гарантирует что все Closeable ресурсы будут закрыты после выполнения try блока. Наш код превращается в следующий более элегантный фрагмент:

PreparedStatement и пакетное выполнение запросов

Если вам нужно выполнить несколько похожих запросов, то разумным решением будет использование PreparedStatement.

PreparedStatement представляет собой скомпилированную версию SQL-выражения, выполнение которого будет быстрее и эффективнее.

PreparedStatement поддерживает пакетную (batch) отправку SQL запросов, что значительно уменьшает траффик между клиентом и базой данных. Небольшой пример:

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

Транзакции в JDBC

Тех, кто знакомился с Hibernate минуя JDBC, обычно очень удивляет работа с транзакциями.

По умолчанию каждое SQL-выражение автоматически коммитится при выполнении statement.execute и подобных методов. Для того, чтобы открыть транзакцию сначала необходимо установить флаг autoCommit у соединения в значение false. Ну а дальше нам пригодятся всем знакомые методы commit и rollback.

Использование DatabaseMetaData

Лично я часто использую DatabaseMetaData для модификации схемы базы данных программным способом, например:

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

Заключение

Конечно, JDBC API создано далеко не идеальным. Например, SQLException является checked исключением и его повсюду надо тянуть или оборачивать; работа с PreparedStatement достаточно неудобная, как мы уже видели.

Но в подавляющем большинстве случаев я использую именно JDBC для свои приложений, так как JDBC дает максимальную гибкость и эффективность. Возможно с Hibernate вы сэкономите один день, так как вам не придется писать код для создания схемы, а так же запросы для чтения и записи объектов. Но что такое один день по сравнению со временем существования приложения? К тому же практика показывает, что периодически Hibernate преподносит разрабочикам интересные челенджи, решение которых может забрать не только время, но и нервы

Полный исходный код примеров из статьи можно найти здесь SqlExamples.java.

Источник

Русские Блоги

Разница между DriverManager и DataSource и тестовым кодом JDBC

В чем разница между DriverManager и DataSource, подключающимся к базе данных?
Традиционное соединение jdbc DriverManager, после регистрации через Class.forName («XXX»), вы можете получить соединение через DriverManager.getConnection ().
Источник данных построен на основе службы JNDI и требует, чтобы сервер приложений сконфигурировал источник данных. Сначала необходимо зарегистрировать источник данных (как правило, в /META-INF/context.xml), а затем обратиться к этому источнику данных в файле web.xml, вы можете использовать DataSource.getConnection. () Получить соединение, ссылку на конкретную операцию (раздел Ресурсы JNDI в каталоге tomcat)

В чем разница между источником данных и пулом DBCP?
Когда J2EE-сервер запущен, будет установлено определенное количество подключений к пулу, и оно будет поддерживать как минимум это количество подключений к пулу. Когда клиентская программа должна подключиться, драйвер пула возвращает неиспользуемое подключение к пулу и записывает его как занятое. Если в данный момент нет свободных соединений, драйвер пула создает определенное количество соединений, количество новых соединений определяется параметрами конфигурации. Когда вызов подключения к используемому пулу завершен, драйвер пула записывает эту таблицу подключений как неактивную, и другие вызовы могут использовать это подключение.
Эквивалент инструмента, оптимизированного для DataSource

Пример настройки источника данных весной, xml выглядит следующим образом:

В случае большого количества посещений и большого параллелизма, несомненно, следует использовать пул соединений BasicDataSource, поскольку благодаря функции пула соединений и эффективность, и использование ресурсов лучше, чем DriverManagerDataSource.

Источник

Любое современное приложение работает с разного рода данными. Получает их, обрабатывает, анализирует, хранит. Сами же эти данные тоже должны где-то хранится. Так вот, данные хранятся в специальных базах данных, управляемых разного рода СУБД (Системами Управления Базами Данных), а JDBC (Java DataBase Connectivity) – Java API для взаимодействия с СУБД. Из некоторых важных характеристик JDBC API стоит отметить, то что он абстрактный (абстрагирует разработчика от нюансов конкретной СУДБ). При этом сам разработчик может использовать специфические детали СУБД.

Как JDBC взаимодействует с базой данных?

После прочтения первого абзаца этот вопрос возникает естественным образом. Действительно, как? Ведь существует огромное количество баз данных (Oracle, PostgreSQL, MySQL и т.д. ), каждая из которых имеет свое собственное API, даже разные синтаксисы SQL! Для взаимодействия с базой данных необходимо использовать JDBC Driver, который предоставляется разработчиками самой базы данных. Т.е. при работе с Oracle, необходимо использовать драйвер предоставляемый Oracle. Конечно, это необязательно. Никто не запрещает вам сделать свой собственный JDBC Driver с Блэк-джэком и … ну вы поняли 🙂 Этот подход описывает один из паттернов “Банды 4-х” – Bridge. Будучи разработчиком вы врятли будите его часто использовать.

Для чего нужен drivermanager jdbc. Смотреть фото Для чего нужен drivermanager jdbc. Смотреть картинку Для чего нужен drivermanager jdbc. Картинка про Для чего нужен drivermanager jdbc. Фото Для чего нужен drivermanager jdbc

Как вы можете видеть JDBC Driver реализует нативный протокол, по которому происходит обращение к серверу базы данных. Причем мы работает с интерфейсом JDBC. Который уже работает с драйвером. Как раз это позволяет нам, быть устойчивыми к изменению СУБД. Поменять Oracle на PostgreSQL? Легко! Меняем только драйвер, реализацию не трогаем. Так же может быть ситуация, когда нам необходимо использовать несколько драйверов. Поэтому в JVM есть возможность централизовано хранить их. Для этого необходимо создать объект класса DriverManager( по сути Singletone) и зарегистрировать драйвера в менеджере.

DriverManager

Для чего нужен drivermanager jdbc. Смотреть фото Для чего нужен drivermanager jdbc. Смотреть картинку Для чего нужен drivermanager jdbc. Картинка про Для чего нужен drivermanager jdbc. Фото Для чего нужен drivermanager jdbc

Работа протекает таким образом, что разработчику обращается к драйверу с помощью метода getConnection() в параметрах которого передает “свойства” базы данных(DB_URL). Ниже подробнее рассмотрим этот метод. Далее DriverManager предоставляет экземпляр драйвера, который соответствует переданным свойствам. Отмети, что если в менеджере находится несколько одинаковых драйверов, то возвращен будет только первый соотвествующий входным параметрам getConnection(). Для того, чтобы использовать DriverManager, необходимо зарегистрировать в нем ваши драйвера (только если вы работаете с JDBC 4, это произойдет автоматически). Для этого вам предоставляется на выбор несколько вариантов:

Установка соединения с базой данных

Когда же мы, наконец установили драйвер, зарегистрировали его в DriverManager, мы устанавливаем соединение с базой данных. Как написано выше, для получения соединения нам необходимо вызвать у менеджера метод getConnection(). Метод реализован в трех вариантах.

Источник

Установление связи с базой данных с использованием JDBC

Содержание

Введение

JDBC является библиотекой Java 2 Standard Edition (J2SE), используемой для взаимодействия с базами данных SQL. Для изучения данной статьи вам потребуется доступ к базе данных. Если у вас не установлены базы данных, можно воспользоваться базой данных MYSQL, бесплатной БД, которую можно скачать на сайте www.mysql.org. Она работает во многих операционных средах.

Для чего нужен drivermanager jdbc. Смотреть фото Для чего нужен drivermanager jdbc. Смотреть картинку Для чего нужен drivermanager jdbc. Картинка про Для чего нужен drivermanager jdbc. Фото Для чего нужен drivermanager jdbc

Драйвер отображает JDBC-команды на используемую вами базу данных. Для MySQL драйвер можно найти на сайтах Sourceforge.net и MySQL.org.

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

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

Шаг 2: Установите соединение с базой данных. Соединение включает в себя указание на определенный источник данных. От этого источника зависит выбор необходимого драйвера.

Для чего нужен drivermanager jdbc. Смотреть фото Для чего нужен drivermanager jdbc. Смотреть картинку Для чего нужен drivermanager jdbc. Картинка про Для чего нужен drivermanager jdbc. Фото Для чего нужен drivermanager jdbc

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

Шаг 1: Загрузка JDBC-драйвера

При поверхностном рассмотрении JDBC-драйверы можно считать классами. Они должны реализовывать интерфейс java.sql.Driver, однако разработчикам редко требуется использовать этот интерфейс напрямую. Единственным требованием к реализации драйвера является то, что при загрузке класс должен самостоятельно регистрироваться при помощи java.sql.DriverManager. Выполнение данного требования находится под ответственностью поставщика драйвера, но ни в коем случае не пользователя. Вам необходимо только загрузить класс, причем сделать это можно тремя различными способами:

Первый возможный способ загрузки JDBC-драйвера:

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

Например, если в пути для доступа к SQL прописано mysql-2.0.13-bin.jar, вам потребуется создать экземпляр класса org.gjt.mm.mysql.Driver:

Данный метод хорошо работает для загрузки драйвера, однако у него есть свои недостатки. Хотя JDBC агностируем базой данных, пользователю вашего приложения придется использовать MySQL. Если пользователь предпочитает Oracle или Sybase, то для запуска программы нужно обязательно иметь MySQL.

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

Второй возможный способ загрузки JDBC-драйвера:

Можно избежать создания двух экземпляров драйвера путем передачи в строке методу forName класса Class имени класса. Данное имя класса должно быть полностью пригодным (например, в случае с MySQL-драйвером им может быть org.gjt.mm.mysql.Driver) и задаваться в кавычках:

В обоих из этих случаев жестко задается имя драйвера базы данных, однако предпочтительнее использовать второй способ. Так как драйвер динамически загружается во время рабочего цикла, то при компиляции классам драйвера вовсе не обязательно быть доступными. При этом вам не требуется жестко задавать строку. Все что вы можете сделать – это извлечь имя драйвера из командной строки (или откуда-либо еще) и передать его. Таким образом, ваша программа будет работать и с MySQL, и с любым другим сервером БД, не требуя при этом никаких изменений или перекомпиляций кода.

Третий способ загрузки JDBC-драйвера:

В первых двух предлагаемых нами методах вам требовалось передать откуда-либо имена драйверов. Существует и третий способ загрузки драйвера, не требующий написания никакого исходного кода. Укажите драйвер или набор драйверов, установив системное свойство jdbc.drivers, как показано ниже:

Теперь в случае необходимости драйвер будет автоматически доступен для DriverManager. Если необходимо сделать доступными несколько драйверов, напишите их список, разделив элементы знаком «двоеточие».

Шаг 2: Установление соединения с базой данных

Источники данных идентифицируются при помощи URI-адреса, начинающегося с “jdbc:”. Продолжение строки зависит от вашего JDBC-драйвера. Каждому драйверу соответствует уникальная строка для отображения на драйвер, а также определенный механизм для локализации сервера, с которым должен будет взаимодействовать драйвер.

В случае драйвера MySQL, используется строка «mysql», а локализация задается другим URI. Полная строка будет иметь следующий формат:

Более конкретно, если хост, с которым вы хотите установить соединение, расположен на вашей же машине, именем базы данных является test и вам не требуется проверка имени пользователя и пароля, то в конечном итоге строка примет следующий вид:

Если у вас есть соответствующий URI, необходимый для идентификации драйвера, и драйвер, который может установить соединение с источником данных, то возможно фактическое соединение с источником. Для подобного поиска DriverManager обеспечивает метод getConnection. Данный метод возвращает объект Connection от первого драйвера, поддерживающего специальный протокол (в данном случае mysql). Если протокол не поддерживается ни одним зарегистрированным драйвером, то во время рабочего цикла возникнет ошибка.

Имя субпротокола (в данном случае mysql) определено в документации для JDBC-драйвера.

После установки соединения доступ к источнику данных становится открытым. Тем не менее, существует и второй способ, позволяющий идентифицировать и устанавливать соединение с источником данных. Источники данных могут быть получены посредством именной службы JNDI (Java Naming and Directory Interface).

Устанавливая соединение при помощи интерфейса JNDI, вместо DriverManager используется DriverSource и Context. Конкретнее, в случае MySQL реализацией javax.sql.DriverSource является класс org.gjt.mm.mysql.jdbc2.optional.MysqlDataSource, который обычно регистрируется вне области действия приложения. Вашему приложению остается только найти источник данных, основываясь на имени, привязанному к контексту.

Установив соединение, вы получаете доступ к базе данных, так же, как и при поиске DriverManager. Поиск DriverManager обычно производится в контексте приложения J2EE.

О наличие доступа к JNDI окружению станет известно, так как обычно оно не настроено только на поиск JDBC-источника.

Проверить оба способа соединения с базой данных можно при помощи специального тестового комплекта MySQL. Вы сможете найти в нем контрольные примеры JNDIDataSource и выражения. Для других баз данных также существуют подобные комплекты, однако вы можете воспользоваться и этим. Вам потребуется лишь произвести незначительные настройки, указав источник данных и драйвер, соответствующий данной БД.

Проверить полученные знания можно при помощи он-лайн теста.

Интерфейсы Connection и DatabaseMetaData и класс DriverManager

JDBC обеспечивает программный интерфейс API, позволяющий при помощи языка программирования Java получать доступ к данным, хранимым в таких источниках, как реляционная база данных, а также обрабатывать их. API включает в себя пакет java.sql, называемый основным API для JDBC, а также пакет javax.sql, являющийся необязательным API для JDBC (он включен в поставку J2SE версии 1.4).

Описываемые здесь интерфейсы и класс можно найти в пакете java.sql.

Для чего нужен drivermanager jdbc. Смотреть фото Для чего нужен drivermanager jdbc. Смотреть картинку Для чего нужен drivermanager jdbc. Картинка про Для чего нужен drivermanager jdbc. Фото Для чего нужен drivermanager jdbc

Интерфейс Connection представляет сессию соединения с базой данных, обеспечиваемую драйвером. Он также обеспечивает методы для создания выражений, управления соединениями и их свойствами. Метод ConnectiongetMetaData:

бросает исключение SQLException.

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

getConnection(String url) Пытается установить соединение с URL-адресом заданной базы данных.

getConnection(String url, Properties info) Пытается установить соединение с URL-адресом заданной базы данных. Параметры: url – адрес в формате jdbc:subprotocol:subname, info – список произвольных пар тег/значение типа String, передаваемых в качестве аргументов соединения. Обычно должна быть включена хотя бы одна пара «имя пользователя»/«пароль».

getConnection(String url, String user, String password) Пытается установить соединение с URL-адресом заданной базы данных. Параметры: url – адрес в формате jdbc:subprotocol:subname, user – пользователь базы данных, от имени которого устанавливается соединение, password – пароль пользователя.

Интерфейс DatabaseMetaData обеспечивает информацию о самой базе данных. Некоторые методы в этом интерфейсе принимают форму строк. Метод, извлекающий информацию о свойстве, не поддерживаемом драйвером, бросает исключение SQLException.

Вот несколько методов данного интерфейса:

getDriverName Извлекает имя текущего JDBC-драйвера.

getDriverVersion Извлекает значение версии JDBC-драйвера в виде строки.

getDatabaseProductVersion Извлекает значение версии текущего продукта БД.

Создайте программу, устанавливающую соединение с вашей базой данных

Отобразите информацию о базе данных и о драйвере, используемом для установки соединения

Методы для получения доступа к информации о базе данных доступны посредством интерфейса DatabaseMetaData, ассоциированного с соединением.

Java Data Objects

JDO (Java Data Objects – объекты данных Java) является программным интерфейсом API, позволяющим устанавливать «прозрачный» доступ к базе данных. Программист может написать код на языке Java, организующий «прозрачный» доступ к основному хранилищу данных, не привлекая для этой цели специальный код БД.

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

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

JDO обеспечивает программистам дополнительные удобства, а также контроль типов во время компиляции. Кроме того, JDO скрывает от программистов SQL, так что его изучение становится необязательным.

API JDO создается в Java Community Process.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *