Пакет javax.sql
java.sql и, начиная с версии 1.4, включен в Java Platform, Standard Edition (Java SE). Он по-прежнему является неотъемлемой частью Java Platform, Enterprise Edition (Java EE). Пакет javax.sql предоставляет следующее:
- Интерфейс
DataSourceв качестве альтернативы интерфейсуDriverManagerдля установления соединения с источником данных - Пулы подключений и пулы заявок
- Распределенные транзакции
- Наборы строк
Приложения используют API DataSource и RowSet напрямую, но API пулов подключений и распределенных транзакций используются внутри инфраструктуры среднего уровня.
Использование объекта DataSource для создания соединения
Пакет javax.sql предоставляет предпочтительный способ создания соединения с источником данных. Класс DriverManager, первоначальный механизм, по-прежнему валиден, и код, использующий его, продолжит работать. Однако, новый механизм DataSource предпочтительнее, так как он предлагает много преимуществ по сравнению с механизмом DriverManager.
Вот основные преимущества использования объекта DataSource для создания соединения:
- Можно изменять свойства источника данных, что означает, что при изменении чего-либо в источнике данных или драйвере не требуется вносить изменения в код приложения.
- Пулы подключений и заявок, а также распределенные транзакции доступны через объект
DataSource, реализованный для работы с инфраструктурой среднего уровня. Соединения, созданные черезDriverManager, не имеют возможностей пула подключений и заявок или распределенных транзакций.
Поставщики драйверов предоставляют реализации DataSource. Конкретный объект DataSource представляет конкретный физический источник данных, и каждое соединение, которое создает объект DataSource , является соединением с этим физическим источником данных.
Логическое имя источника данных регистрируется в службе именования, использующей API Java Naming and Directory Interface (JNDI), обычно системным администратором или лицом, выполняющим обязанности системного администратора. Приложение может получить нужный ему объект DataSource , выполнив поиск по зарегистрированному логическому имени. Затем приложение может использовать объект DataSource для создания соединения с физическим источником данных, который он представляет.
Объект DataSource может быть реализован для работы с инфраструктурой среднего уровня, чтобы создаваемые им соединения были объединены для повторного использования. Приложение, использующее такую реализацию DataSource , автоматически получит подключение, участвующее в пуле подключений. Объект DataSource также может быть реализован для работы с инфраструктурой среднего уровня, чтобы создаваемые им соединения могли использоваться для распределенных транзакций без специального кодирования.
Пулы подключений и пулы заявок
Соединения, созданные через объект DataSource, реализованный для работы с менеджером пула подключений среднего уровня, будут участвовать в пуле подключений. Это может значительно улучшить производительность, так как создание новых соединений очень дорого. Пул подключений позволяет использовать и повторно использовать соединение, существенно сокращая количество новых создаваемых соединений.
Пул подключений полностью прозрачен. Он выполняется автоматически на среднем уровне конфигурации Java EE, поэтому с точки зрения приложения изменения в коде не требуются. Приложение просто использует метод DataSource.getConnection для получения подключенного соединения и использует его так же, как и любой объект Connection.
Классы и интерфейсы, используемые для пула подключений:
-
ConnectionPoolDataSource -
PooledConnection -
ConnectionEvent -
ConnectionEventListener -
StatementEvent -
StatementEventListener
ConnectionPoolDataSource вызывается для создания объекта PooledConnection, менеджер пула подключений зарегистрируется как объект ConnectionEventListener с новым объектом PooledConnection. При закрытии подключения или возникновении ошибки менеджер пула подключений (как слушатель) получает уведомление, включающее объект ConnectionEvent. Если менеджер пула подключений поддерживает пулы заявок, например Statement, что можно определить, вызвав метод DatabaseMetaData.supportsStatementPooling, менеджер пула подключений зарегистрируется как объект StatementEventListener с новым объектом PooledConnection. При закрытии подключения или возникновении ошибки менеджер пула подключений (как слушатель) получает уведомление, включающее объект StatementEvent.
Распределенные транзакции
Как и в случае с подключенными соединениями, соединения, созданные через объект DataSource, реализованный для работы с инфраструктурой среднего уровня, могут участвовать в распределенных транзакциях. Это дает приложению возможность включать источники данных на нескольких серверах в одну транзакцию.
Классы и интерфейсы, используемые для распределенных транзакций:
-
XADataSource -
XAConnection
Интерфейс XAConnection наследуется от интерфейса PooledConnection, поэтому то, что применимо к подключенному соединению, также применимо к соединению, являющемуся частью распределенной транзакции. Менеджер транзакций на среднем уровне обрабатывает все прозрачно. Единственное изменение в коде приложения заключается в том, что приложение не может делать ничего, что могло бы помешать обработке транзакции менеджером транзакций. В частности, приложение не может вызывать методы Connection.commit или Connection.rollback, и оно не может установить соединение в режим автоматического подтверждения (т.е., не может вызвать Connection.setAutoCommit(true)).
Приложению не нужно делать ничего особенного для участия в распределенной транзакции. Оно просто создает соединения с необходимыми источниками данных с помощью метода DataSource.getConnection так же, как и обычно. Менеджер транзакций управляет транзакцией за кулисами. Интерфейс XADataSource создает объекты XAConnection, и каждый объект XAConnection создает объект XAResource, который менеджер транзакций использует для управления соединением.
Наборы строк
ИнтерфейсRowSet работает с различными другими классами и интерфейсами за кулисами. Их можно сгруппировать в три категории. - Уведомление об событиях
-
RowSetListener
ОбъектRowSetявляется компонентом JavaBeans, так как имеет свойства и участвует в механизме уведомлений об событиях JavaBeans. ИнтерфейсRowSetListenerреализуется компонентом, который хочет получать уведомления об событиях, происходящих с конкретным объектомRowSet. Такой компонент регистрируется как слушатель в наборе строк (rowset) через методRowSet.addRowSetListener.Когда объект
RowSetизменяет одну из своих строк, все свои строки или перемещает свой курсор, он также уведомляет каждого зарегистрированного слушателя. Слушатель реагирует, выполняя реализацию метода уведомления, вызываемого для него. -
RowSetEvent
В рамках своего внутреннего процесса уведомления объектRowSetсоздаёт экземплярRowSetEventи передает его слушателю. Слушатель может использовать этот объектRowSetEventдля определения того, какой набор строк (rowset) вызвал событие.
-
- Метаданные
-
RowSetMetaData
Этот интерфейс, производный от интерфейсаResultSetMetaData, предоставляет информацию о столбцах в объектеRowSet. Приложение может использовать методыRowSetMetaDataдля определения количества столбцов в наборе строк (rowset) и типа данных каждого столбца.Интерфейс
RowSetMetaDataпредоставляет методы для установки информации о столбцах, но приложение обычно не использует эти методы. Когда приложение вызывает методRowSetexecute, объектRowSetбудет содержать новый набор строк, а его объектRowSetMetaDataбудет внутренне обновлён, чтобы содержать информацию о новых столбцах.
-
- Модуль чтения/записи
ОбъектRowSet, реализующий интерфейсRowSetInternal, может вызвать метод объектаRowSetReader, связанного с ним, чтобы заполнить себя данными. Он также может вызвать метод объектаRowSetWriter, связанного с ним, чтобы записать все изменения в его строках обратно в источник данных, из которого он изначально получил эти строки. Набор строк (rowset), остающийся подключенным к источнику данных, не нуждается в использовании модулей чтения и записи, так как может просто работать напрямую с источником данных.-
RowSetInternal
Реализуя интерфейсRowSetInternal, объектRowSetполучает доступ к своему внутреннему состоянию и может вызвать методы своего модуля чтения и записи. Набор строк (rowset) отслеживает значения в текущих строках и значения, которые непосредственно предшествовали текущим, называемые исходными значениями. Набор строк (rowset) также отслеживает (1) параметры, установленные для его команды, и (2) подключение, если оно было передано. Набор строк (rowset) использует методыRowSetInternalдля доступа к этой информации. Приложение обычно не вызывает эти методы напрямую. -
RowSetReader
Отключённый объектRowSet, реализовавший интерфейсRowSetInternal, может вызвать метод своего модуля чтения (объектRowSetReader, связанный с ним) для заполнения себя данными. Когда приложение вызывает методRowSet.execute, этот метод вызывает модуль чтения набора строк (rowset) для выполнения большей части работы. Реализации могут сильно различаться, но в общем случае модуль чтения устанавливает подключение к источнику данных, считывает данные из источника данных и заполняет набор строк (rowset) ими, а затем закрывает подключение. Модуль чтения также может обновить объектRowSetMetaDataдля набора строк (rowset). Внутреннее состояние набора строк (rowset) также обновляется либо модулем чтения, либо напрямую методомRowSet.execute. -
RowSetWriter
Отключённый объектRowSet, реализовавший интерфейсRowSetInternal, может вызвать метод своего модуля записи (объектRowSetWriter, связанный с ним) для записи изменений обратно в базовый источник данных. Реализации могут сильно различаться, но в общем случае модуль записи выполнит следующие действия:- Установить подключение к источнику данных
- Проверить наличие конфликта, то есть, изменилось ли значение, изменённое в наборе строк (rowset), в источнике данных
- Записать новые значения в источник данных, если конфликта нет
- Закрыть подключение
-
Интерфейс RowSet может быть реализован различными способами, и любой может создать свою реализацию. Разработчикам рекомендуется использовать свою фантазию для создания новых способов использования наборов строк (rowset).
Спецификация пакета
Связанная документация
Книга Java Series, опубликованная Addison-Wesley Longman, содержит подробную информацию о классах и интерфейсах в пакете javax.sql:
- “JDBC™ API Руководство и справочник, третье издание”
| Класс | Описание |
|---|---|
| CommonDataSource | Интерфейс, определяющий методы, общие для DataSource, XADataSource и ConnectionPoolDataSource. |
| ConnectionEvent | Объект Event, предоставляющий информацию об источнике события, связанного с подключением. |
| ConnectionEventListener | Объект, регистрирующийся для получения уведомлений о событиях, генерируемых объектом PooledConnection. |
| ConnectionPoolDataSource | Фабрика для объектов PooledConnection. |
| DataSource | Фабрика для подключений к физическому источнику данных, представленному этим объектом DataSource. |
| PooledConnection | Объект, предоставляющий средства для управления пулом подключений. |
| PooledConnectionBuilder | Билдер, созданный из объекта ConnectionPoolDataSource, используемый для установления подключения к базе данных, которую представляет объект data source. |
| RowSet | Интерфейс, добавляющий поддержку модели компонентов JavaBeans к API JDBC. |
| RowSetEvent | Объект Event , генерируемый при возникновении события с объектом RowSet. |
| RowSetInternal | Интерфейс, реализуемый объектом RowSet для представления себя объектам RowSetReader или RowSetWriter. |
| RowSetListener | Интерфейс, который должен быть реализован компонентом, желающим получать уведомления о значительных событиях в жизни объекта RowSet. |
| RowSetMetaData | Объект, содержащий информацию о столбцах в объекте RowSet. |
| RowSetReader | Модуль, который вызывается отключённым объектом RowSet для заполнения себя строками данных. |
| RowSetWriter | Объект, реализующий интерфейс RowSetWriter, называемый записью. |
| StatementEvent | Сообщение StatementEvent отправляется всем StatementEventListener , которые были зарегистрированы с PooledConnection. |
| StatementEventListener | Объект, регистрирующийся для получения уведомлений о событиях, возникающих в PreparedStatements в пуле Statement. |
| XAConnection | Объект, обеспечивающий поддержку распределённых транзакций. |
| XAConnectionBuilder | Билдер, созданный из объекта XADataSource , используемый для установления подключения к базе данных, которую представляет объект data source. |
| XADataSource | Фабрика для объектов XAConnection , используемая внутри. |
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.sql/javax/sql/package-summary.html