Модуль 2 Рассматриваемые темы: Схемы взаимодействия с СУБД Введение в JDBC API Структура JDBC-программы Типы JDBC-драйверов Архитектура JDBC слайд 2-1
Типы СУБД В данном курсе под СУБД мы будем понимать реляционные СУБД – РСУБД РСУБД могут быть: Клиент-серверными (распределенными) Файловыми (локальными) Типы СУБД слайд 2-2
Файловые СУБД слайд 2-3 Типы СУБД Приложения ОС Машина пользователя Файловый протокол Данные как набор файлов
Клиент-серверные СУБД слайд 2-4 Запрос к СУБД Данные Типы СУБД Прикладное ПО (клиент БД) СУБД
Файловые СУБД просты, но обладают целым рядом недостатков Клиент-серверные СУБД сложнее в разработке и поддержке Но они незаменимы при больших объемах данных и высоких нагрузках В данном курсе под СУБД мы будем понимать клиент-серверные СУБД Выводы по типам СУБД слайд 2-5 Типы СУБД
Схемы взаимодействия с СУБД Можно выделжить две основных схемы взаимодействия с клиент-серверной СУБД: Двухзвенная Трехзвенная слайд 2-6
Схемы взаимодействия с СУБД слайд 2-7 Двухзвенная схема «клиент-сервер» Пользователи СУБД Сетевой протокол Клиентское ПО СУБД (Stand-alone db-client)
Проста и эффективна Проблемы с надежностью Проблемы с нагрузочной масштабируемостью Проблемы с производительностью (в случае многопользовательского клиента) Проблематично реализовать распределенные транзакции Выводы: слайд 2-8 Двухзвенная схема
Схемы взаимодействия с СУБД слайд 2-9 Трехзвенная схема «клиент-сервер» Пользователи СУБД Клиентское ПО (Stand-alone db-client) Промежуточное ПО доступа к СУБД (DB middleware)
За счет потенциальной избыточности: Повышение надежности Повышение нагрузочной масштабируемости Повышение производительности За счет централизации: Возможность распределенных транзакций Повышение безопасности Повышение производительности (в случае многопользовательского клиента) Усложнение схемы доступа к СУБД Выводы: слайд 2-10 Трехзвенная схема
слайд 2-11 Схемы доступа Веб-пользователи СУБД Клиентское ПО (веб-браузер) Промежуточное ПО доступа к СУБД (DB middleware) БД-пользователи Клиентское ПО (клиент СУБД) Сервер приложений (веб)
слайд 2-12 Схемы доступа На платформе J2EE: JDBC-сервис (расширение JDBC в J2EE) JDBC-сервис (расширение JDBC в J2EE) JDBC Browser 1..N
Архитектура JDBC Рассматриваемые темы: Схемы взаимодействия с СУБД Введение в JDBC API Структура JDBC-программы Типы JDBC-драйверов слайд 2-13
Java DataBase Connectivity API слайд 2-14 JDBC API JDBC – Java API для взаимодействия с СУБД JDBC API – стандартен, регламентируется компанией Sun JDBC – неотъемлемая часть платформы J2SE Технологически JDBC API представляет собой набор Java-классов и интерфейсов, включен в JRE ( rt.jar )
JDBC 1.2 поддерживает стандарты SQL/89, SQL/92 JDBC абстрагирует разработчика от нюансов конкретного типа СУБД Это повышает переносимость программ При желании разработчик может использовать специфические детали СУБД слайд 2-15 JDBC API JDBC – абстрактный API
(Расширения JDBC для J2EE находятся в пакете javax.sql ) слайд 2-16 Пакет java.sql
Разработчик в прикладной программе по большей части будет работать с интерфейсами Эти интерфейсы – часть JDBC API Такой подход способствует повышению переносимости программ слайд 2-17 JDBC API Интерфейсы
Архитектура JDBC Рассматриваемые темы: Схемы взаимодействия с СУБД Введение в JDBC API Структура JDBC-программы Типы JDBC-драйверов слайд 2-18
Драйвер реализует native-протокол взаимодействия с СУБД Разработчику драйвер афиширует стандартный (регламентированный в JDBC API) интерфейс Драйвер – это Java-класс JDBC-драйвер – необходимый элемент любой JDBC-программы слайд 2-19 JDBC-драйвер
слайд 2-20 JDBC-драйвер Сервер БД JVM Heap Экземпляры классов разработчика JDBC-интерфейс Экземпляр JDBC-драйвера DB-native протокол
Кто пишет класс JDBC-драйвера? Регламентирован ли протокол взаимодействия с СУБД? Унифицирован ли интерфейс драйвера? Как создавать объект драйвера так, чтобы не hardcod-жить имя класса драйвера в коде приложения? слайд 2-21 JDBC-драйвер Вопросы
Класс JDBC-драйвера пишет, как правило, разработчик СУБД или третья сторона, энтузиасты Протокол взаимодействия с СУБД – детали функционирования конкретной СУБД, зачастую он проприетарный Для загрузки класса драйвера удобно использовать механизм Reflection слайд 2-22 JDBC-драйвер Выводы
В случае использования нескольких драйверов возникает множество рутинных задач их отслеживания и менеджмента Это проблематично при компонентной разработке Выход – централизация всех драйверов в данной JVM слайд 2-23 JDBC-драйвера Проблемы
Класс DriverManager является уровнем управления в JDBC и находится между пользователем и драйверами Он отслеживает все доступные драйверы и управляет установлением соединений между БД и соответствующим драйвером Реализует шаблон Singleton слайд 2-24DriverManager Централизация всех драйверов в данной JVM
слайд 2-25DriverManager Сервер БД JVM Heap Экземпляры классов разработчика Экземпляры JDBC-драйверов DriverManager Каждый экземпляр драйвера зарегистрирован в DriverManager DriverManager. getConnection(…) DB-native протокол
Можно вручную зарегистрировать драйвер в DriverManager : Но можно автоматизировать этот процесс: В спецификации указано, что драйвер должен самостоятельно регистрировать себя в DriverManager при загрузке его класса Поэтому достаточно просто загрузжить класс драйвера слайд 2-26 Регистрация в DriverManager DriverManager.registerDriver( new MyDriver () ); MyDBClient.java
Создать его экземпляр: Воспользоваться механизмом Reflection: Какие плюсы и минусы этих подходов? слайд 2-27 Загрузка классов драйверов Для загрузки класса драйвера можно: new MyDriver (); MyDBClient.java Class.forName( MyDriver ); //или Class theDriver = MyDriver.class; MyDBClient.java
Использовать свойство (property) JVM jdbc.drivers : DriverManager подгружает их при инициализации Первый же вызов метода класса DriverManager повлечет за собой загрузку и регистрацию этих драйверов слайд 2-28 Загрузка классов драйверов Оптимальный вариант: java -Djdbc.drivers= MyDriver1 ; MyDriver2 MyDBClient Command prompt
Для инициализации JDBC-драйвера следует загрузжить его класс При загрузке класса драйвера он самостоятельно зарегистрирует себя в DriverManager Оптимальный вариант загрузки классов – не делать это вручную, а указать список драйверов в свойстве JVM jdbc.drivers при запуске программы слайд 2-29 Инициализация драйверов Выводы
DB-URL однозначно идентифицирует источник данных (базу данных) DB-URL принимается JDBC- драйвером Формат DB-URL рекомендуется компанией Sun разработчикам СУБД и JDBC-драйверов слайд 2-30 Установка соединения с СУБД Понятие DB-URL (или JDBC-URL)
subprotocol тип драйвера JDBC (производителя) и механизма взаимодействия с сервером БД subname идентификатор источника данных (базы данных) слайд 2-31 Установка соединения с СУБД Формат DB-URL jdbc:subprotocol:subname DB-URL
слайд 2-32 Установка соединения с СУБД Примеры DB-URL jdbc:pointbase:server://dbhost:9092/HRDATABASE Pointbase DBMS Oracle DBMS jdbc:odbc:myAccessDB Источник данных ODBC jdbc:msql://db_host:1114/db_test MySQL DBMS
слайд 2-33 Установка соединения с СУБД Каракас типичной программы import java.sql.*; public static void main(String[] args){ try{ Class.forName( com.pointbase.jdbc.jdbcUniversalDriver ); Connection connection = DriverManager.getConnection( jdbc:pointbase:server:// :9092/HRDB ); //Бизнес-логика omitted connection.close(); }catch(Exception e){ e.printStackTrace(); } } MyDBClient.java
слайд 2-34 Установка соединения с СУБД Исключения Почти каждый метод в JDBC API выбрасывает явные (explicit) исключения Поэтому разработчик обязан обрабатывать их На данном этапе нас интересуют два исключения: ClassNotFoundException SQLException ,
слайд 2-35 Установка соединения с СУБД Сервер БД JVM Heap Экземпляры классов разработчика Экземпляры JDBC-драйверов DriverManager Каждый экземпляр драйвера зарегистрирован в DriverManager DriverManager.getConnection( jdbc:pointbase: ) DB-native протокол
Как DriverManager узнает, через какой именно драйвер устанавливать соединение? Их же может быть загружено множество? слайд 2-36 Установка соединения с СУБД Вопрос по 6 этапу
DriverManager.getConnetion() получает DB-URL DriverManager опрашивает все зарегистрированные драйвера, кто из них отвечает за данный под протокол Первый откликнувшийся и будет использован для установки соединения Возвращается интерфейс Connection слайд 2-37 Установка соединения с СУБД Выводы по 6 этапу jdbc:pointbase:server://dbhost:9092/HRDATABASE Pointbase DB-URL
слайд 2-38 Установка соединения с СУБД Сервер БД Экземпляры классов разработчика Загруженные экземпляры JDBC-драйверов DriverManager опрашивает драйвера, кто отвечает за данный под протокол. Первый откликнувшийся и будет использован для установки соединения. DriverManager.getConnection( jdbc:pointbase: ) Стандартный интерфейс драйвера Возвращается объект, реализующий стандартный интерфейс Connection. Класс реализации - ? 8 8
DriverManager.getConnection() имеет три варианта: Свойства – это пары «ключ-значение» Наборы свойств специфичны для СУБД слайд 2-39 Установка соединения с СУБД Свойства соединения DriverManager.getConnection(String DBURL ) DriverManager.getConnection(String DBURL, Properties props ) DriverManager.getConnection(String DBURL, String user, String password )
слайд 2-40 Установка соединения с СУБД Свойства соединения – примеры Драйвер Свойства соединения Oracleuser, password, servername Sybaseuser, password, servername, portnumber MSSQL4user, password, servername Informixuser, password, databasename, informixserver, servername, portnumber PointBasecache.size, crypto.communication, database.home, databse.pagesize
Разработчик может не закрывать соединение явно. Это сделает сборщик мусора JVM при удалении java-объекта соединения Но разработчику следует явно закрывать соединения Почему? слайд 2-41 Установка соединения с СУБД Закрытие соединения connection.close(); MyDBClient.java
Разработчику следует явно закрывать соединения Каждое соединение – ресурсы на стороне БД Ресурсы эти ограничены Следует минимизировать время использования соединения в клиенте БД Но слишком частые открытия/закрытия соединений будут затормаживать работу клиента (для двухзвенной схемы) Следует соблюдать баланс слайд 2-42 Установка соединения с СУБД Закрытие соединения
слайд 2-43 Установка соединения с СУБД Выводы import java.sql.*; public static void main(String[] args){ try{ Class.forName( com.pointbase.jdbc.jdbcUniversalDriver ); Connection connection = DriverManager.getConnection( jdbc:pointbase:server:// :9092/HRDB, admin, admin ); //Бизнес-логика omitted connection.close(); }catch(Exception e){ e.printStackTrace(); } } MyDBClient.java
Архитектура JDBC Рассмотриваемые темы: Схемы взаимодействия с СУБД Введение в JDBC API Структура JDBC-программы Типы JDBC-драйверов слайд 2-44
слайд 2-45 Типы JDBC-драйверов Спецификация регламентирует четыре типа JDBC-драйверов:
слайд 2-46 Типы JDBC-драйверов Type 1 – JDBC-ODBC Bridge Сервер БД JVM Heap Экземпляры классов разработчика JDBC-интерфейс JDBC-драйвер 1 типа DB-native протокол ОС Windows ODBC Драйвер ODBC Драйвер Источник данных ODBC, использующий ODBC-драйвер Протокол ODBC
слайд 2-47 Типы JDBC-драйверов Type 1 – JDBC-ODBC Bridge Класс этого драйвера включен в JRE Для его использования необходимо настрожить источник данных ODBC в Windows В коде клиента необходимо использовать следующую DB-URL: jdbc:odbc:MyODBCDataSource DB-URL для ODBC
слайд 2-48 Типы JDBC-драйверов Type 2 – JDBC-native Bridge Сервер БД JVM Heap Экземпляры классов разработчика JDBC-интерфейс JDBC-драйвер 2 типа DB-native протокол ОС Native драйвер или native-API Native драйвер или native-API Driver-native протокол
слайд 2-49 Типы JDBC-драйверов Type 2 – JDBC-native Bridge Класс этого драйвера пишется производителем СУБД или третьей стороной Сначала необходимо на выбранной ОС правильно установжить и сконфигурировать native-драйвер для выбранной СУБД (или native-API) Возникают сложности с переносимостью
слайд 2-50 Типы JDBC-драйверов Type 4 – Pure-java driver (thin driver) Сервер БД JVM Heap Экземпляры классов разработчика JDBC-интерфейс JDBC-драйвер 4 типа DB-native протокол ОС
слайд 2-51 Типы JDBC-драйверов Type 4 – Pure-java driver (thin driver) Драйвер целиком написан на Java Достигается отличная переносимость клиентов
слайд 2-52 Типы JDBC-драйверов Type 3 – JDBC-Net driver Сервер БД JVM Heap Экземпляры классов разработчика JDBC-интерфейс JDBC-драйвер 3 типа ОС DB middleware Сервер БД Middleware-native протокол DB-native протокол
слайд 2-53 Типы JDBC-драйверов Type 3 – JDBC-Net driver Реализует трехуровневую схему доступа к СУБД Взаимодействует с JDBC-сервисом J2EE-контейнера
слайд 2-54 Типы JDBC-драйверов Выводы
Архитектура JDBC Рассмотренные темы: Схемы взаимодействия с СУБД Введение в JDBC API Структура JDBC-программы Типы JDBC-драйверов слайд 2-55