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

Класс DriverManager

Класс DriverManager является уровнем управления JDBC, отслеживает все доступные драйверы и управляет установлением соединений между БД и соответствующим драйвером.

Прежде чем подключаться к серверу БД необходимо определиться с соответствующим драйвером JDBC, который представляет собой *.jar файл. В следующей таблице представлен список jdbc.drivers для нескольких СУБД.

СУБД Драйвер JDBC Сайт производителя
Oracle oracle.jdbc.OracleDriver http://www.oracle.com/technetwork/database/jdbc-112010-090769.html
MSSQL com.microsoft.jdbc.sqlserver.SQLServerDriver http://www.microsoft.com/en-us/download
PostgreSQL org.postgresql.Driver https://jdbc.postgresql.org/download.html
MySQL com.mysql.jdbc.Driver http://dev.mysql.com/downloads/connector/j/
Derby org.apache.derby.jdbc.ClientDriver http://db.apache.org/derby/derby_downloads.html

Примечание :
1. Драйверы лучше всего скачивать с сайта производителей СУБД.
2. Необходимо учитывать особенности использования подключения к серверу СУБД. Например, если использовать БД Derby в монопольном режиме, т.е. как хранилище, то лучше подключать драйвер org.apache.derby.jdbc.EmbeddedDriver.

Для подключения драйвера лучше всего разместить его в одной из поддиректорией приложения и прописать в classpath. При использовании IDE для разработки приложения подключение драйвера JDBC можно выполнить через интерфейс среды разработки.

Загрузка драйвера JDBC

DriverManager.registerDriver

Чтобы сказать диспетчеру драйверов JDBC, какой именно драйвер следует загрузить, необходимо выполнить одну из команд :

Команды все равнозначны. Задача заключается в том, чтобы classloader загрузил нужный драйвер. Например :

Загрузка драйвера JDBC может производиться и другим способом. При вызове Java машины (JVM) можно указать в значении специального системного свойства jdbc.drivers название класса JDBC драйвера:

В этом случае при первой попытке установления соединения с базой данных менеджер драйверов автоматически сам загрузит класс указанный в системном свойстве jdbc.drivers.

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

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

Для обеспечения безопасности управления драйвером JDBC DriverManager отслеживает, каким загрузчиком классов ClassLoader загружен драйвер. При открытии соединения с сервером БД используется только драйвер, поступивший либо из локальной файловой системы, либо загруженные тем же ClassLoader’ом, которым загружено приложение, запросившее соединение с БД.

Соединение с сервером БД

DriverManager.getConnection

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

Мост JDBC-ODBC-Bridge

На внутреннем уровне JDBC-ODBC-Bridge преобразует методы Java в вызовы ODBC и тем самым позволяет использовать любые существующие драйверы ODBC, которых к настоящему времени накоплено в изобилии. Однако, чаще всего, все-таки используется механизм ODBC благодаря его универсальности и доступности.

Особенности использования JDBC-ODBC

Следующий код демонстрирует соединение с сервером БД с использованием моста jdbc-odbc-bridge :

В случае применения моста jdbc-odbc-bridge в URL-строку подставляется DSN (Data Source Name), т.е. имя ODBC-источника из ODBC.INI файла.

Пример динамической загрузки JDBC-драйвера рассмотрен здесь.

Источник

Jdbc для чего нужен drivermanager

Основная услуга для того, чтобы управлять рядом драйверов JDBC.
ОТМЕТЬТЕ: DataSource интерфейс, новый в JDBC 2.0 API, обеспечивает другой способ соединиться с источником данных. Использование a DataSource объект является привилегированными средствами соединения с источником данных.

Как часть его инициализации, DriverManager class попытается загрузить классы драйвера, на которые ссылаются в «jdbc.drivers» системном свойстве. Это позволяет пользователю настраивать Драйверы JDBC, используемые их приложениями. Например в Вашем

/.hotjava/properties файл Вы могли бы определить:

Когда метод getConnection вызывается, DriverManager попытается определить местоположение подходящего драйвера от среди загруженных в инициализации и загруженных явно использование того же самого classloader как текущий апплет или приложение.

Читайте также:  что делать если комп завис на запуске

Сводка метода

Все Методы Статические Методы Конкретные Методы Устаревшие Методы
Модификатор и Тип Метод и Описание
static void deregisterDriver(Driver driver)

Методы, наследованные от class java.lang. Объект

Деталь метода

getLogWriter

setLogWriter

getConnection

Отметьте: Если свойство определяется как часть url и также определяется в Properties объект, это определяется с помощью реализации, относительно которого будет иметь приоритет значение. Для максимальной мобильности приложение должно только определить свойство однажды.

getConnection

Отметьте: Если свойство определяется как часть url и также определяется в Properties объект, это определяется с помощью реализации, относительно которого будет иметь приоритет значение. Для максимальной мобильности приложение должно только определить свойство однажды.

getConnection

getDriver

registerDriver

registerDriver

deregisterDriver

Если a null значение определяется для драйвера, который будет удален, тогда никакие меры не предпринимаются.

Если менеджер безопасности существует и checkPermission отрицает разрешение, тогда a SecurityException будет брошен.

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

Если a DriverAction экземпляр был определен, когда драйвер JDBC был зарегистрирован, вычеркивать из списка метод будет вызван до драйвера, удаляемого из списка зарегистрированных драйверов.

Источник

На этот раз я хотел бы уделить внимание работе с базами данных с помощью 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.

Источник

Руководство 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 для чего нужен drivermanager

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

В чем заключаются преимущества использования JDBC?

Преимуществами JDBC считают:

Что из себя представляет JDBC URL?

JDBC URL состоит из:

Пример JDBC URL для подключения к MySQL базе данных «Test» расположенной по адресу localhost и ожидающей соединений по порту 3306: jdbc:mysql://localhost:3306/Test

Из каких частей стоит JDBC?

JDBC состоит из двух частей:

JDBC превращает вызовы уровня API в «родные» команды того или иного сервера баз данных.

Перечислите основные классы и интерфейсы JDBC.

Перечислите основные типы данных используемые в JDBC. Как они связаны с типами Java?

JDBC Type Java Object Type
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT Boolean
TINYINT Integer
SMALLINT Integer
INTEGER Integer
BIGINT Long
REAL Float
FLOAT Double
DOUBLE Double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
CLOB Clob
BLOB Blob
ARRAY Array
STRUCT Struct
REF Ref
DISTINCT сопоставление базового типа
JAVA_OBJECT базовый класс Java

Опишите основные этапы работы с базой данных при использовании JDBC.

Как зарегистрировать драйвер JDBC?

Регистрацию драйвера можно осуществить несколькими способами:

Class.forName(«полное имя класса драйвера») ;

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

В качестве параметра может передаваться:

Какие уровни изоляции транзакций поддерживаются в JDBC?

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

Во время использования транзакций, для обеспечения целостности данных, СУБД использует блокировки, чтобы заблокировать доступ других обращений к данным, участвующим в транзакции. Такие блокировки необходимы, чтобы предотвратить:

«грязное» чтение (dirty read) — чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится);

неповторяющееся чтение (non-repeatable read) — при повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются изменёнными;

фантомное чтение (phantom reads) — ситуация, когда при повторном чтении в рамках одной транзакции одна и та же выборка дает разные множества строк.

Уровни изоляции транзакций определены в виде констант интерфейса java.sql.Connection :

TRANSACTION_NONE – драйвер не поддерживает транзакции;

TRANSACTION_READ_UNCOMMITTED – позволяет транзакциям видеть несохраненные изменения данных: разрешает грязное, непроверяющееся и фантомное чтения;

TRANSACTION_READ_COMMITTED – любое изменение, сделанное в транзакции, не видно вне неё, пока она не сохранена: предотвращает грязное чтение, но разрешает непроверяющееся и фантомное;

TRANSACTION_REPEATABLE_READ – запрещает грязное и непроверяющееся, фантомное чтение разрешено;

TRANSACTION_SERIALIZABLE – грязное, непроверяющееся и фантомное чтения запрещены.

NB! Сервер базы данных может не поддерживать все уровни изоляции. Интерфейс java.sql.DatabaseMetaData предоставляет информацию об уровнях изолированности транзакций, которые поддерживаются данной СУБД.

При помощи чего формируются запросы к базе данных?

Для выполнения запросов к базе данных в Java используются три интерфейса:

Объекты-носители интерфейсов создаются при помощи методов объекта java.sql.Connection :

Чем отличается Statement от PreparedStatement?

Перед выполнением СУБД разбирает каждый запрос, оптимизирует его и создает «план» (query plan) его выполнения. Если один и тот же запрос выполняется несколько раз, то СУБД в состоянии кэшировать план его выполнения и не производить этапов разборки и оптимизации повторно. Благодаря этому запрос выполняется быстрее.

Суммируя: PreparedStatement выгодно отличается от Statement тем, что при повторном использовании с одним или несколькими наборами параметров позволяет получить преимущества заранее прекомпилированного и кэшированного запроса, помогая при этом избежать SQL Injection.

Как осуществляется запрос к базе данных и обработка результатов?

Выполнение запросов осуществляется при помощи вызова методов объекта, реализующего интерфейс java.sql.Statement :

Как вызвать хранимую процедуру?

Выбор объекта зависит от характеристик хранимой процедуры:

Если неизвестно, как была определена хранимая процедура, для получения информации о хранимой процедуре (например, имен и типов параметров) можно использовать методы java.sql.DatabaseMetaData позволяющие получить информацию о структуре источника данных.

Пример вызова хранимой процедуры с входными и выходными параметрами:

Как закрыть соединение с базой данных?

Соединение с базой данной закрывается вызовом метода close() у соответствующего объекта java.sql.Connection или посредством использования механизма try-with-resources при создании такого объекта, появившегося в Java 7.

NB! Предварительно необходимо закрыть все запросы созданные этим соединением.

Источник

Читайте также:  чем разбитое стекло что значит
Сказочный портал