Пакет javax.sql
Предоставляет API для доступа к источникам данных и обработки на стороне сервера из языка программирования Java™. Этот пакет дополняет пакет 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.
| Интерфейс | Описание |
|---|---|
| CommonDataSource | Интерфейс, определяющий методы, общие для |
| ConnectionEventListener | Объект, регистрирующийся для получения уведомлений о событиях, генерируемых объектом |
| ConnectionPoolDataSource | Фабрика для объектов |
| DataSource | Фабрика для подключений к физическому источнику данных, который представляет этот объект |
| PooledConnection | Объект, предоставляющий средства для управления пулом подключений. |
| PooledConnectionBuilder | Построитель, созданный из объекта |
| RowSet | Интерфейс, добавляющий поддержку модели компонентов JavaBeans™ к API JDBC. |
| RowSetInternal | Интерфейс, который реализует объект |
| RowSetListener | Интерфейс, который должен быть реализован компонентом, желающим получать уведомления о значимых событиях в жизни объекта |
| RowSetMetaData | Объект, содержащий информацию о столбцах в объекте |
| RowSetReader | Модуль, который вызывается отключённым объектом |
| RowSetWriter | Объект, реализующий интерфейс |
| StatementEventListener | Объект, регистрирующийся для получения уведомлений о событиях, происходящих на PreparedStatements в пуле Statement. |
| XAConnection | Объект, обеспечивающий поддержку распределённых транзакций. |
| XAConnectionBuilder | Построитель, созданный из объекта |
| XADataSource | Фабрика для объектов |
| Класс | Описание |
|---|---|
| ConnectionEvent | Объект |
| RowSetEvent | Объект |
| StatementEvent | Объект |
© 1993, 2020, 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/11/docs/api/java.sql/javax/sql/package-summary.html