Пакет javax.sql
java.sql и, начиная с версии 1.4, включён в платформу Java SE (Java Platform, Standard Edition). Он остаётся важной частью платформы Java EE (Java Platform, Enterprise Edition). Пакет javax.sql предоставляет следующее:
- Интерфейс
DataSourceв качестве альтернативы интерфейсуDriverManagerдля установления соединения с источником данных - Пулы соединений и пулы заявок
- Распределённые транзакции
- Наборы строк
Приложения используют API DataSource и RowSet напрямую, но API пулов соединений и распределённых транзакций используются инфраструктурой среднего уровня (middle-tier) внутри.
Использование объекта 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 Series, опубликованная издательством Addison-Wesley Longman, содержит подробную информацию о классах и интерфейсах в пакете javax.sql:
- “JDBC™API Tutorial and Reference, Третье издание”
| Класс | Описание |
|---|---|
| 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, 2021, 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/17/docs/api/java.sql/javax/sql/package-summary.html