Пакет 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, записывает изменения обратно в исходный источник данных, когда вызывается метод 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 Требования Реализация, соответствующая требованиям, полностью подключаемая к 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 отключен от своего источника данных. Уровни 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, предоставляемого этим объектом, определяет уровень (уровень проверки) конфликтов. После завершения проверки конфликтов и обнаружения одного или нескольких конфликтов метод acceptChanges выбрасывает объект SyncProviderException. Приложение может перехватить исключение и использовать его для получения объекта SyncResolver.
Затем приложение может использовать методы SyncResolver для получения информации о каждом конфликте и принятия решения о дальнейших действиях. Если приложение или пользователь решат, что значение в объекте RowSet должно быть сохранено, приложение или пользователь могут перезаписать значение в источнике данных.
Комментарий к интерфейсу SyncResolver содержит более подробные сведения.
5.0 Связанные спецификации
6.0 Связанная документация
- Since:
- 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://download.java.net/java/early_access/jdk24/docs/api/java.sql.rowset/javax/sql/rowset/spi/package-summary.html