Пакет javax.sql.rowset.spi
RowSet объект мог использовать реализацию, поставщик должен зарегистрировать ее в SyncFactory синглтоне. (См. комментарий к классу SyncProvider для полного объяснения процесса регистрации и используемой конвенции именования.) Содержание
- 1.0 Спецификация пакета
- 2.0 Архитектура поставщика услуг
- 3.0 Руководство для разработчиков реализаций
- 4.0 Разрешение конфликтов синхронизации
- 5.0 Связанные спецификации
- 6.0 Связанная документация
1.0 Спецификация пакета
Следующие классы и интерфейсы составляют пакет javax.sql.rowset.spi:
-
SyncFactory -
SyncProvider -
SyncFactoryException -
SyncProviderException -
SyncResolver -
XmlReader -
XmlWriter -
TransactionalWriter
javax.sql также являются частью SPI: -
RowSetReader -
RowSetWriter
Реализация SyncProvider предоставляет отключенный RowSet объект с механизмами для чтения данных в него и для записи измененных данных обратно в исходный источник данных. Читатель, объект RowSetReader или XMLReader, считывает данные в объект RowSet, когда вызываются методы execute или populate. Писатель, объект RowSetWriter или XMLWriter, записывает изменения обратно в исходный источник данных, когда вызывается метод CachedRowSet acceptChanges.
Процесс записи изменений в объект RowSet в его источник данных известен как синхронизация. Реализация SyncProvider объекта RowSet определяет уровень синхронизации, который использует писатель объекта RowSet. Различные уровни синхронизации называются классами.
Более низкие классы синхронизации известны как оптимистические уровни конкурентности, потому что они оптимистично предполагают, что конфликтов будет мало или совсем нет. Конфликт возникает, когда одни и те же данные, измененные в объекте RowSet, также были изменены в источнике данных. Использование оптимистической модели конкурентности означает, что в случае конфликта изменения либо в источнике данных, либо в объекте RowSet будут потеряны.
Более высокие классы синхронизации называются пессимистическими, потому что они предполагают, что другие будут обращаться к источнику данных и вносить изменения. Эти классы устанавливают различные уровни блокировок, чтобы увеличить вероятность отсутствия конфликтов.
Самый низкий уровень синхронизации — это просто запись любых изменений, внесенных в объект RowSet в его исходный источник данных. Писатель ничего не делает, чтобы проверить конфликты. Если произойдет конфликт и значения источника данных будут перезаписаны, изменения, внесенные другими участниками в источник данных, будут потеряны.
Реализация RIXMLProvider использует самый низкий уровень синхронизации и просто записывает RowSet изменения в источник данных.
На следующем уровне писатель проверяет наличие конфликтов и, если они есть, ничего не записывает в источник данных. Проблема с этим уровнем конкурентности заключается в том, что если другая сторона изменила соответствующие данные в источнике данных после того, как объект RowSet получил свои данные, изменения, внесенные в объект RowSet , будут потеряны. Реализация RIOptimisticProvider использует этот уровень синхронизации.
На более высоких уровнях синхронизации, называемых пессимистической конкурентностью, писатель предпринимает шаги для предотвращения конфликтов, устанавливая блокировки. Установка блокировок может варьироваться от блокировки одной строки до блокировки таблицы или всего источника данных. Таким образом, уровень синхронизации является компромиссом между возможностью одновременного доступа пользователей к источнику данных и способностью писателя поддерживать синхронизацию данных в объекте RowSet и его источнике данных.
Требуется, чтобы все отключенные объекты RowSet (объекты CachedRowSet, FilteredRowSet, JoinRowSet и WebRowSet) получали свои объекты SyncProvider из механизма SyncFactory.
Реализация справки (RI) предоставляет двух поставщиков синхронизации.
-
RIOptimisticProvider
Поставщик по умолчанию, который экземплярSyncFactoryпредоставит отключенному объектуRowSetпри отсутствии указанной реализации поставщика.
Этот поставщик синхронизации использует оптимистическую модель конкурентности, предполагая, что конфликты между пользователями, обращающимися к одним и тем же данным в базе данных, будут редкими. Он избегает использования блокировок; вместо этого он проверяет наличие конфликтов перед попыткой синхронизации объектаRowSetи источника данных. Если конфликт обнаружен, ничего не происходит, то есть изменения в объектеRowSetне сохраняются в источнике данных. -
RIXMLProvider
Поставщик синхронизации, который может использоваться с объектомWebRowSet, который представляет собой набор строк, который можно записать в формате XML или прочитать из формата XML. РеализацияRIXMLProviderвообще не проверяет конфликты и просто записывает любые обновленные данные в объектеWebRowSetв базовый источник данных. ОбъектыWebRowSetиспользуют этого поставщика при работе с данными XML.
SyncProvider поставляются с эталонной реализацией, что делает их всегда доступными для реализаций RowSet. Реализации SyncProvider делают себя доступными, регистрируясь в синглтоне SyncFactory. Когда объект RowSet запрашивает поставщика, указав его в конструкторе или как аргумент методу CachedRowSet setSyncProvider, синглтон SyncFactory проверяет, зарегистрирован ли запрашиваемый поставщик. Если да, синглтон SyncFactory создаёт его экземпляр и передаёт его запрашивающему объекту RowSet. Если указанная реализация SyncProvider не зарегистрирована, синглтон SyncFactory вызывает исключение SyncFactoryException. Если поставщик не указан, синглтон SyncFactory создаст экземпляр реализации поставщика по умолчанию RIOptimisticProvider и передаст его запрашивающему объекту RowSet. Если объект WebRowSet не указывает поставщика в своём конструкторе, SyncFactory предоставит ему экземпляр RIOptimisticProvider. Однако, конструктор WebRowSet реализован так, что устанавливает поставщика на RIXMLProvider, который считывает и записывает объект RowSet в формате XML.
Подробнее см. в спецификации класса SyncProvider.
Поставщики могут разработать реализацию SyncProvider с любым из возможных уровней синхронизации, предоставляя объектам RowSet выбор механизмов синхронизации.
2.0 Архитектура поставщика услуг
2.1 Обзор Интерфейс поставщика услуг предоставляет подключаемый механизм, посредством которого реализации SyncProvider могут регистрироваться и затем генерироваться при необходимости. Механизм ленивой ссылки, используемый классом SyncFactory, ограничивает излишнее потребление ресурсов, не создавая экземпляр до тех пор, пока отключенный объект RowSet его не потребует. Класс SyncFactory также предоставляет стандартный API для настройки параметров и потоков логгирования, которые могут предоставляться конкретной реализацией SyncProvider.
2.2 Регистрация в SyncFactory
Третья сторона SyncProvider реализация должна быть зарегистрирована в SyncFactory для того, чтобы отключенный объект RowSet мог её получить и тем самым использовать её реализации javax.sql.RowSetReader и javax.sql.RowSetWriter. Для всех реализаций SyncProvider доступны следующие механизмы регистрации:
- Системные свойства - Свойства, заданные в командной строке. Эти свойства задаются во время выполнения и применяются ко всему системному вызову приложения Java. См. раздел "Связанная документация" для дополнительной информации.
-
Файлы свойств - Свойства, указанные в стандартном файле свойств. Это может быть задано с помощью системного свойства или путём изменения стандартного файла свойств, расположенного в среде выполнения платформы. Реализация справки этой технологии включает стандартный файл свойств, который можно изменить, чтобы добавить дополнительные объекты
SyncProvider. -
Контекст JNDI - Доступные поставщики могут быть зарегистрированы в контексте JNDI.
SyncFactoryпопытается загрузить объектыSyncProvider, связанные с контекстом, и зарегистрировать их в фабрике. Этот контекст должен быть предоставленSyncFactoryдля корректной работы механизма.
Подробное объяснение того, как задавать системные свойства или свойства в файле свойств, и как настроить контекст JNDI, приведено в описании класса SyncFactory.
2.3 Политики генерации экземпляров поставщика SyncFactory
SyncFactory генерирует запрашиваемый объект SyncProvider , если поставщик был корректно зарегистрирован. Следующие политики соблюдаются при создании отключенного объекта RowSet с указанной реализацией SyncProvider или при его переконфигурации во время выполнения с альтернативным объектом SyncProvider.
- Если объект
SyncProviderуказан иSyncFactoryне содержит ссылки на поставщика, выбрасывается исключениеSyncFactoryException. - Если объект
SyncProviderуказан иSyncFactoryсодержит ссылку на поставщика, предоставляется запрашиваемый поставщик. - Если объект
SyncProviderне указан, предоставляется поставщик по умолчаниюRIOptimisticProvider.
Эти политики более подробно рассмотрены в классе SyncFactory.
3.0 Руководство для разработчиков реализаций
3.1 Требования Реализующее SyncProvider соответствие, полностью подключаемое в SyncFactory должно расширять и реализовывать все абстрактные методы в классе SyncProvider. Кроме того, реализация должна определять характеристики уровня, блокировки и возможности обновления представлений, определенные в классе SyncProvider. Обязательно должно быть поддерживание одного или нескольких критериев описания SyncProvider. Ожидается, что поставщики предложат различные возможности уровня, блокировки и обновляемых представлений.
Кроме того, должен соблюдаться соглашение об именовании SyncProvider, как подробно описано в описании класса SyncProvider.
3.2 Уровни
JSR 114 определяет набор уровней для описания качества синхронизации, которое объект SyncProvider может предоставить объекту с отключенной RowSet связью. Эти уровни перечислены от низшего к высшему уровню качества обслуживания.
-
GRADE_NONE - Синхронизация с исходным источником данных не предоставляется. Реализация
SyncProvider, возвращающая этот уровень, просто попытается записать в исходный источник данных все данные, которые изменились в объектеRowSet, перезаписывая существующие данные. Не предпринимается попытка сравнения исходных значений с текущими значениями для определения конфликтов. РеализацияRIXMLProviderиспользует этот уровень. -
GRADE_CHECK_MODIFIED_AT_COMMIT - Низкий уровень оптимистической синхронизации. Реализация
SyncProvider, возвращающая этот уровень, проверяет наличие конфликтов в строках, которые изменились между последней синхронизацией и текущей синхронизацией. Любые изменения в исходном источнике данных, которые были изменены, не будут отражены в объекте с отключеннойRowSetсвязью. Если конфликтов нет, изменения в объектеRowSetбудут записаны в источник данных. При наличии конфликтов изменения не записываются. РеализацияRIOptimisticProviderиспользует этот уровень. -
GRADE_CHECK_ALL_AT_COMMIT - Высокий уровень оптимистической синхронизации. Реализация
SyncProvider, возвращающая этот уровень, проверяет все строки, включая строки, которые не изменились в объекте с отключеннойRowSetсвязью. Таким образом, любые изменения в строках в базовом источнике данных будут отражены в объекте с отключеннойRowSetсвязью, когда синхронизация завершится успешно. -
GRADE_LOCK_WHEN_MODIFIED - Пессимистический уровень синхронизации. Реализации
SyncProvider, возвращающие этот уровень, будут блокировать строку в исходном источнике данных, соответствующую строке, изменяемой в объектеRowSet, чтобы уменьшить вероятность изменения одних и тех же данных другими процессами в источнике данных. -
GRADE_LOCK_WHEN_LOADED - Более высокий пессимистический уровень синхронизации. Реализация
SyncProvider, возвращающая этот уровень, будет блокировать все представление и/или таблицу, затронутые исходным запросом, используемым для заполнения объектаRowSet.
3.3 Блокировки
JSR 114 определяет набор констант, которые указывают, были ли установлены какие-либо блокировки на базовом источнике данных объекта RowSet и, если да, на каких конструкциях эти блокировки установлены. Эти блокировки останутся в источнике данных, пока объект RowSet отключен от источника данных.
Эти константы следует рассматривать как дополнительные к константам уровня. По умолчанию большинство установок уровня требует, чтобы блокировки источника данных не оставались, когда объект RowSet отключен от источника данных. Уровни GRADE_LOCK_WHEN_MODIFIED и GRADE_LOCK_WHEN_LOADED позволяют объекту с отключенной RowSet связью иметь тонкую настройку уровня блокировки.
-
DATASOURCE_NO_LOCK - Блокировки исходного источника данных отсутствуют. Это значение по умолчанию для всех реализаций
SyncProvider, если не указано иначе объектомRowSet. -
DATASOURCE_ROW_LOCK - Блокировка устанавливается на строки, затронутые исходным SQL-запросом, используемым для заполнения объекта
RowSet. -
DATASOURCE_TABLE_LOCK - Блокировка устанавливается на все таблицы, затронутые запросом, используемым для заполнения объекта
RowSet. -
DATASOURCE_DB_LOCK Блокировка устанавливается на весь источник данных, используемый объектом
RowSet.
3.4 Обновляемые представления
Объект RowSet может быть заполнен данными из SQL-представления VIEW. Следующие константы указывают, может ли объект SyncProvider обновлять данные в таблице или таблицах, из которых получено представление VIEW .
-
UPDATABLE_VIEW_SYNC Указывает, что реализация
SyncProviderподдерживает синхронизацию с таблицей или таблицами, из которых получено SQL-представлениеVIEW, используемое для заполнения объектаRowSet. -
NONUPDATABLE_VIEW_SYNC Указывает, что реализация
SyncProviderне поддерживает синхронизацию с таблицей или таблицами, из которых получено SQL-представлениеVIEW, используемое для заполнения объектаRowSet.
3.5 Использование оценки и блокировки SyncProvider
В приведенном ниже примере реализация CachedRowSetImpl переконфигурирует текущий объект SyncProvider , вызвав метод setSyncProvider.
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.setSyncProvider("com.foo.bar.HASyncProvider");
Приложение может получить доступ к объекту SyncProvider , который в данный момент используется объектом с отключенной RowSet связью. Оно также может получить уровень синхронизации, с которым была реализована поставщиком, и степень используемой в данный момент блокировки. Кроме того, приложение обладает гибкостью в установлении степени используемой блокировки, что может увеличить возможности успешной синхронизации. Эти операции показаны в следующем фрагменте кода.
SyncProvider sync = crs.getSyncProvider();
switch (sync.getProviderGrade()) {
case: SyncProvider.GRADE_CHECK_ALL_AT_COMMIT
//A high grade of optimistic synchronization
break;
case: SyncProvider.GRADE_CHECK_MODIFIED_AT_COMMIT
//A low grade of optimistic synchronization
break;
case: SyncProvider.GRADE_LOCK_WHEN_LOADED
// A pessimistic synchronization grade
break;
case: SyncProvider.GRADE_LOCK_WHEN_MODIFIED
// A pessimistic synchronization grade
break;
case: SyncProvider.GRADE_NONE
// No synchronization with the originating data source provided
break;
}
switch (sync.getDataSourceLock() {
case: SyncProvider.DATASOURCE_DB_LOCK
// A lock is placed on the entire datasource that is used by the
// RowSet object
break;
case: SyncProvider.DATASOURCE_NO_LOCK
// No locks remain on the originating data source.
break;
case: SyncProvider.DATASOURCE_ROW_LOCK
// A lock is placed on the rows that are touched by the original
// SQL statement used to populate
// the RowSet object that is using the SyncProvider
break;
case: DATASOURCE_TABLE_LOCK
// A lock is placed on all tables that are touched by the original
// SQL statement used to populated
// the RowSet object that is using the SyncProvider
break;
Также возможно, используя статический вспомогательный метод в классе SyncFactory, определить список реализаций SyncProvider , которые в настоящее время зарегистрированы в SyncFactory .
Enumeration e = SyncFactory.getRegisteredProviders();
4.0 Разрешение конфликтов синхронизации
ИнтерфейсSyncResolver предоставляет способ для приложения вручную определить, что делать при возникновении конфликта. Когда метод CachedRowSet acceptChanges завершается и обнаруживает один или несколько конфликтов, он выбрасывает объект SyncProviderException . Приложение может перехватить исключение и получить объект SyncResolver , вызвав метод SyncProviderException.getSyncResolver() . Объект SyncResolver , представляющий собой особый вид объекта CachedRowSet или объекта JdbcRowSet, реализовавшего интерфейс SyncResolver, проверяет конфликты строка за строкой. Он представляет собой дубликат объекта RowSet , который синхронизируется, за исключением того, что содержит только данные из источника данных, вызывающего конфликт. Все другие значения столбцов установлены в null. Для перехода от одного значения конфликта к другому объект SyncResolver предоставляет методы nextConflict и previousConflict .
Интерфейс SyncResolver также предоставляет методы для выполнения следующих действий:
- определение, был ли конфликт связан с обновлением, удалением или вставкой
- получение значения в источнике данных, вызвавшего конфликт
- установка значения, которое должно находиться в источнике данных, если его нужно изменить, или установка значения, которое должно находиться в объекте
RowSet, если его нужно изменить
При вызове метода CachedRowSet acceptChanges , он делегирует объект RowSet объекту SyncProvider . То, как реализован поставщик, предоставленный этим объектом SyncProvider , определяет уровень (уровень) проверки на наличие конфликтов. После завершения проверки на наличие конфликтов и обнаружения одного или нескольких конфликтов метод acceptChanges выбрасывает объект SyncProviderException . Приложение может перехватить исключение и использовать его для получения объекта SyncResolver .
Затем приложение может использовать методы SyncResolver для получения информации о каждом конфликте и принятия решения о действиях. Если приложение или пользователь принимают решение, что значение в объекте RowSet должно быть сохранены, приложение или пользователь могут перезаписать значение в источнике данных.
Комментарий к интерфейсу SyncResolver содержит более подробные сведения.
5.0 Связанные спецификации
6.0 Связанная документация
| Класс | Описание |
|---|---|
| SyncFactory | Механизм интерфейса поставщика сервисов (SPI), который генерирует SyncProvider экземпляры для использования отключенными RowSet объектами. |
| SyncFactoryException | Указывает ошибку с механизмом SyncFactory. |
| SyncProvider | Механизм синхронизации, предоставляющий возможности чтения/записи для отключенных RowSet объектов. |
| SyncProviderException | Указывает ошибку с механизмом SyncProvider. |
| SyncResolver | Определяет фреймворк, который позволяет приложениям использовать ручное дерево решений для принятия решений о том, что делать при возникновении конфликта синхронизации. |
| TransactionalWriter | Специализированный интерфейс, который облегчает расширение стандартного SyncProvider абстрактного класса, чтобы он имел более тонкую гранулярность управления транзакциями. |
| XmlReader | Специализированный интерфейс, который облегчает расширение SyncProvider абстрактного класса для поставщиков синхронизации, ориентированных на XML. |
| XmlWriter | Специализированный интерфейс, который облегчает расширение SyncProvider абстрактного класса для поставщиков синхронизации, ориентированных на XML. |
© 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.rowset/javax/sql/rowset/spi/package-summary.html