Пакет javax.sql

Предоставляет API для доступа к источникам данных и обработки на стороне сервера из языка программирования Java™. Этот пакет дополняет пакет java.sql и, начиная с версии 1.4, входит в платформу Java Platform, Standard Edition (Java SE™). Он остается неотъемлемой частью платформы Java Platform, Enterprise Edition (Java EE™).

Пакет javax.sql предоставляет следующее:

  1. Интерфейс DataSource в качестве альтернативы DriverManager для установления соединения с источником данных
  2. Пулы соединений и пулы инструкций
  3. Распределенные транзакции
  4. Наборы строк

Приложения используют 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 работает с различными другими классами и интерфейсами за кулисами. Их можно сгруппировать в три категории.
  1. Уведомление об событии
    • RowSetListener
      Объект RowSet является компонентом JavaBeans™, так как он имеет свойства и участвует в механизме уведомления о событиях JavaBeans. Интерфейс RowSetListener реализуется компонентом, который хочет быть уведомлён о событиях, происходящих с конкретным объектом RowSet. Такой компонент регистрируется в качестве слушателя с помощью rowset посредством метода RowSet.addRowSetListener.

      Когда объект RowSet изменяет одну из своих строк, изменяет все свои строки или перемещает свой курсор, он также уведомляет каждого зарегистрированного слушателя. Слушатель реагирует, выполняя свою реализацию метода уведомления, вызванного у него.

    • RowSetEvent
      В рамках своего внутреннего процесса уведомления объект RowSet создаёт экземпляр RowSetEvent и передает его слушателю. Слушатель может использовать этот объект RowSetEvent для определения, какой rowset был источником события.
  2. Метаданные
    • RowSetMetaData
      Этот интерфейс, производный от интерфейса ResultSetMetaData, предоставляет информацию о столбцах в объекте RowSet. Приложение может использовать методы RowSetMetaData для определения количества столбцов в rowset и типа данных каждого столбца.

      Интерфейс RowSetMetaData предоставляет методы для установки информации о столбцах, но приложение обычно не использует эти методы. Когда приложение вызывает метод RowSet execute, объект RowSet будет содержать новый набор строк, а его объект RowSetMetaData будет внутренне обновлён, чтобы содержать информацию о новых столбцах.

  3. Модуль чтения/записи
    Объект 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

Интерфейс, определяющий методы, общие для DataSource, XADataSource и ConnectionPoolDataSource.

ConnectionEventListener

Объект, регистрирующийся для получения уведомлений о событиях, генерируемых объектом PooledConnection.

ConnectionPoolDataSource

Фабрика для объектов PooledConnection.

DataSource

Фабрика для подключений к физическому источнику данных, который представляет этот объект DataSource.

PooledConnection

Объект, предоставляющий средства для управления пулом подключений.

PooledConnectionBuilder

Построитель, созданный из объекта ConnectionPoolDataSource , используемый для установления подключения к базе данных, которую представляет объект data source.

RowSet

Интерфейс, добавляющий поддержку модели компонентов JavaBeans™ к API JDBC.

RowSetInternal

Интерфейс, который реализует объект RowSet для представления себя объекту RowSetReader или RowSetWriter.

RowSetListener

Интерфейс, который должен быть реализован компонентом, желающим получать уведомления о значимых событиях в жизни объекта RowSet.

RowSetMetaData

Объект, содержащий информацию о столбцах в объекте RowSet.

RowSetReader

Модуль, который вызывается отключённым объектом RowSet для заполнения его строками данных.

RowSetWriter

Объект, реализующий интерфейс RowSetWriter, называемый писателем.

StatementEventListener

Объект, регистрирующийся для получения уведомлений о событиях, происходящих на PreparedStatements в пуле Statement.

XAConnection

Объект, обеспечивающий поддержку распределённых транзакций.

XAConnectionBuilder

Построитель, созданный из объекта XADataSource , используемый для установления подключения к базе данных, которую представляет объект data source.

XADataSource

Фабрика для объектов XAConnection , используемая внутренне.

Класс Описание
ConnectionEvent

Объект Event , предоставляющий информацию о источнике события, связанного с подключением.

RowSetEvent

Объект Event , генерируемый при возникновении события с объектом RowSet.

StatementEvent

Объект StatementEvent отправляется всем StatementEventListener , которые были зарегистрированы с PooledConnection.

© 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

Spec-Zone .ru
спецификации, руководства, описания, API