Пакет 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 объекта CachedRowSet. Объект записи, RowSetWriter или XMLWriter объект, записывает изменения обратно в исходный источник данных при вызове метода acceptChanges объекта CachedRowSet.
Процесс записи изменений в объект 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, 2023, 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/21/docs/api/java.sql.rowset/javax/sql/rowset/spi/package-summary.html