Пакет 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 для PreparedStatements, что можно определить, вызвав метод DatabaseMetaData.supportsStatementPooling, менеджер пула соединений зарегистрируется как объект StatementEventListener с новым объектом PooledConnection. При закрытии PreparedStatement или ошибке менеджер пула соединений (как слушатель) получает уведомление, включающее объект 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 Руководство и справочник, третье издание”
- Since:
- 1.4
| Класс | Описание |
|---|---|
| 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 | Объект, регистрируемый для получения уведомлений о событиях, происходящих на операциях PreparedStatement, находящихся в пуле Statement. |
| XAConnection | Объект, предоставляющий поддержку распределённых транзакций. |
| XAConnectionBuilder | Построитель, созданный из объекта XADataSource, используемый для установления соединения с базой данных, которую представляет объект data source. |
| XADataSource | Фабрика для объектов XAConnection, используемая внутри. |
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.sql/javax/sql/package-summary.html