Пакет javax.sql.rowset.spi
Стандартные классы и интерфейсы, которые должен использовать поставщик третьей стороны при реализации поставщика синхронизации. Эти классы и интерфейсы называются интерфейсом поставщика сервиса (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для правильной работы механизма.
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 Уровни (Grades)
JSR 114 определяет набор уровней (grades), описывающих качество синхронизации, которое объект 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 Блокировки (Locks)
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 Обновляемые представления (Updatable Views)
Объект 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.getDataSourcLock() {
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 Связанная документация
| Интерфейс | Описание |
|---|---|
| SyncResolver | Определяет фреймворк, который позволяет приложениям использовать дерево принятия решений для определения действий при возникновении конфликта синхронизации. |
| TransactionalWriter | Специализированный интерфейс, который облегчает расширение абстрактного класса |
| XmlReader | Специализированный интерфейс, облегчающий расширение абстрактного класса |
| XmlWriter | Специализированный интерфейс, облегчающий расширение абстрактного класса |
| Класс | Описание |
|---|---|
| SyncFactory | Механизм службы поставщика интерфейсов (SPI), который генерирует экземпляры |
| SyncProvider | Механизм синхронизации, предоставляющий возможности чтения/записи для объектов разобщённых |
| Исключение | Описание |
|---|---|
| SyncFactoryException | Указывает ошибку в механизме |
| SyncProviderException | Указывает ошибку в механизме |
© 1993, 2020, 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/11/docs/api/java.sql.rowset/javax/sql/rowset/spi/package-summary.html