Класс 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, какой именно драйвер следует загрузить, необходимо выполнить одну из команд :

  1. Class.forName(“полное имя класса”)
  2. Class.forName(“полное имя класса”).newInstance()
  3. DriverManager.registerDriver(new “полное имя класса”)

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

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

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

java -Djdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver myClass

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

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

Примечание : если при выполнении программы вы получаете ошибку No driver available - это, скорее всего, означает, что вы просто неправильно указалт путь к драйверу в переменной CLASSPATH.

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

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

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

DriverManager.getConnection

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

Мост JDBC-ODBC-Bridge

Получить доступ к серверу базы данных можно с использованием моста JDBC - ODBC. Программа взаимодействия между драйвером JDBC и ODBC была разработана фирмой JavaSoft в сотрудничестве с InterSolv. Данная "связка" реализована в виде класса JdbcOdbc.class (для платформы Windows JdbcOdbc.dll).

При использовании JDBC - ODBC необходимо принимать во внимание, что помимо JdbcOdbc-библиотек должны существовать специальные драйвера (библиотеки), которые реализуют непосредственный доступ к базам данных через стандартный интерфейс ODBC. Как правило эти библиотеки описываются в файле ODBC.INI.

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

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

JDBC DriverManager является "хребтом" JDBC-архитектуры, и его основная функция очень проста - соединить Java-программу и соответствующий JDBC драйвер и затем "выйти из игры". Структура драйвера ODBC была взята в качестве основы JDBC из-за его популярности среди независимых поставщиков программного обеспечения и пользователей. Но может возникнуть законный вопрос - а зачем вообще нужен JDBC? не легче ли было организовать интерфейсный доступ к ODBC-драйверам непосредственно из Java? Путь через JDBC-ODBC-Bridge, как ни странно, может оказаться гораздо короче. С чем это связано:

  • ODBC основан на C-интерфейсе и его нельзя использовать непосредственно из Java. Вызов из Java C-кода нарушает целостную концепцию Java и пробивает брешь в защите.
  • Так как Java не имеет указателей, а ODBC их использует, то перенос ODBC C-API в Java-API нежелателен.
  • Java-API необходим, чтобы добиться абсолютно чистых Java решений. Когда ODBC используется, то ODBC-драйвер и ODBC менеджер должны быть инсталлированы на каждой клиентской машине. В то же время, JDBC драйвер написан полностью на Java и может быть легко переносим на любые платформы.

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

import java.net.URL;
import java.sql.*;
import java.io.*;

class SimpleSelect
{
    public static void main (String args[])
    {
        String url   = "jdbc:odbc:dBase";
        String query = "SELECT * FROM users"; 
    try {
        // Загрузка jdbc-odbc-bridge драйвера
        Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
        DriverManager.setLogStream(System.out); 

        // Попытка соединения с драйвером. Каждый из
        // зарегистрированных драйверов будет загружаться, пока
        // не будет найден тот, который сможет обработать этот URL

        Connection con = DriverManager.getConnection (url, "username", "password"); 

        // Если соединиться не удалось, то произойдет exception (исключительная ситуация). 

        // Получить DatabaseMetaData объект и показать информацию о соединении

        DatabaseMetaData dma = con.getMetaData ();

        // Печать сообщения об успешном соединении
        System.out.println("\nConnected to " + dma.getURL());
        System.out.println("Driver " + dma.getDriverName());
        System.out.println("Version " + dma.getDriverVersion());

        // Закрыть соединение
        con.close();
    } catch (SQLException e) {
        System.out.println ("\n*** SQLException caught ***\n");
		while (e != null) {
            System.out.println ("SQLState: " + e.getSQLState ());
            System.out.println ("Message: " + e.getMessage ());
            System.out.println ("Vendor: " + e.getErrorCode ());
            e = e.getNextException ();
		}
    } catch (java.lang.Exception ex) {
        e.printStackTrace ();
    }
}

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

  Рейтинг@Mail.ru