Пакет 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.addRowSetListener.Когда объект
RowSetизменяет одну из своих строк, изменяет все свои строки или перемещает курсор, он также уведомляет каждого зарегистрированного слушателя. Слушатель реагирует, выполняя свою реализацию вызванного метода уведомления. -
RowSetEvent
В рамках внутреннего процесса уведомления объектRowSetсоздает экземплярRowSetEventи передает его слушателю. Слушатель может использовать этот объектRowSetEvent, чтобы узнать, в каком наборе строк произошло событие.
-
- Метаданные
-
RowSetMetaData
Этот интерфейс, производный от интерфейсаResultSetMetaData, предоставляет сведения о столбцах объектаRowSet. Приложение может использовать методыRowSetMetaData, чтобы узнать, сколько столбцов содержит набор строк и какие типы данных может содержать каждый столбец.Интерфейс
RowSetMetaDataпредоставляет методы для задания сведений о столбцах, однако обычно приложение не использует эти методы. Когда приложение вызывает методRowSetexecute, объектRowSetполучает новый набор строк, а его объектRowSetMetaDataвнутренне обновляется и содержит сведения о новых столбцах.
-
- Средство чтения/записи
ОбъектRowSet, реализующий интерфейсRowSetInternal, может обратиться к связанному с ним объектуRowSetReader, чтобы заполнить себя данными. Он также может обратиться к связанному с ним объектуRowSetWriter, чтобы записать изменения строк обратно в источник данных, из которого они были получены. Набору строк, сохраняющему соединение с источником данных, не нужно использовать средство чтения и средство записи, поскольку он может непосредственно работать с источником данных.-
RowSetInternal
Реализуя интерфейсRowSetInternal, объектRowSetполучает доступ к своему внутреннему состоянию и может обращаться к средствам чтения и записи. Набор строк отслеживает значения в текущих строках и значения, которые были непосредственно перед текущими, называемые исходными значениями. Набор строк также отслеживает (1) параметры, заданные для его команды, и (2) переданное ему соединение, если оно есть. Для доступа к этим сведениям набор строк незаметно для приложения использует методыRowSetInternal. Обычно приложение не вызывает эти методы напрямую. -
RowSetReader
Отключенный объектRowSet, реализовавший интерфейсRowSetInternal, может обратиться к своему средству чтения (связанному с ним объектуRowSetReader), чтобы заполнить себя данными. Когда приложение вызывает методRowSet.execute, этот метод поручает средству чтения набора строк выполнить значительную часть работы. Реализации могут существенно различаться, но обычно средство чтения устанавливает соединение с источником данных, считывает данные из него, заполняет ими набор строк и закрывает соединение. Средство чтения также может обновить объектRowSetMetaDataнабора строк. Внутреннее состояние набора строк также обновляется либо средством чтения, либо непосредственно методомRowSet.execute. -
RowSetWriter
Отключенный объектRowSet, реализовавший интерфейсRowSetInternal, может обратиться к своему средству записи (связанному с ним объектуRowSetWriter), чтобы записать изменения обратно в базовый источник данных. Реализации могут существенно различаться, но обычно средство записи выполняет следующие действия:- Устанавливает соединение с источником данных
- Проверяет наличие конфликта, то есть не было ли изменено в источнике данных значение, которое было изменено в наборе строк
- При отсутствии конфликта записывает новые значения в источник данных
- Закрывает соединение
-
Интерфейс RowSet может реализовываться различными способами, и написать такую реализацию может любой желающий. Разработчикам предлагается проявить фантазию и придумать новые способы использования наборов строк.
Спецификация пакета
Связанная документация
В книге серии Java, опубликованной Addison-Wesley Longman, подробно описаны классы и интерфейсы пакета javax.sql:
- «Руководство и справочник по API JDBC™, третье издание»
- Начиная с версии:
- 1.4
| Класс | Описание |
|---|---|
| CommonDataSource | Интерфейс, определяющий методы, общие для DataSource, XADataSource и ConnectionPoolDataSource. |
| ConnectionEvent | Объект Event, содержащий сведения об источнике события, связанного с соединением. |
| ConnectionEventListener | Объект, регистрирующийся для получения уведомлений о событиях, создаваемых объектом PooledConnection. |
| ConnectionPoolDataSource | Фабрика объектов PooledConnection. |
| DataSource | Фабрика соединений с физическим источником данных, который представляет этот объект DataSource. |
| PooledConnection | Объект, предоставляющий средства для управления пулом соединений. |
| PooledConnectionBuilder | Построитель, созданный на основе объекта ConnectionPoolDataSource и предназначенный для установления соединения с базой данных, которую представляет объект data source. |
| RowSet | Интерфейс, добавляющий в API JDBC поддержку компонентной модели JavaBeans. |
| 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, 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://docs.oracle.com/en/java/javase/25/docs/api/java.sql/javax/sql/package-summary.html