Пакет 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 при вызове методов CachedRowSet или 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 или прочитать из него. Реализация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 Руководство для разработчиков реализаций SyncProvider
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 Связанная документация
- Начиная с версии:
- 1.5
| Класс | Описание |
|---|---|
| SyncFactory | Механизм интерфейса поставщика служб (SPI), создающий экземпляры SyncProvider для использования отключёнными объектами RowSet. |
| SyncFactoryException | Указывает на ошибку в механизме SyncFactory. |
| SyncProvider | Механизм синхронизации, предоставляющий возможности чтения и записи для отключённых объектов RowSet. |
| SyncProviderException | Указывает на ошибку в механизме SyncProvider. |
| SyncResolver | Определяет инфраструктуру, позволяющую приложениям использовать дерево решений для ручного выбора действий при возникновении конфликта синхронизации. |
| TransactionalWriter | Специализированный интерфейс, позволяющий расширить стандартный абстрактный класс SyncProvider и обеспечить более точное управление транзакциями. |
| XmlReader | Специализированный интерфейс, позволяющий расширить абстрактный класс SyncProvider для поставщиков синхронизации, ориентированных на XML. |
| XmlWriter | Специализированный интерфейс, позволяющий расширить абстрактный класс SyncProvider для поставщиков синхронизации, ориентированных на XML. |
© 1993, 2025, 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/25/docs/api/java.sql.rowset/javax/sql/rowset/spi/package-summary.html