Пакет javax.sql.rowset.spi
Стандартные классы и интерфейсы, которые должен использовать поставщик третьей стороны при реализации поставщика синхронизации.
См.: Описание
| Интерфейс | Описание |
|---|---|
| SyncResolver | Определяет структуру, позволяющую приложениям использовать дерево решений для определения действий при возникновении конфликта синхронизации. |
| TransactionalWriter | Специализированный интерфейс, облегчающий расширение стандартного |
| XmlReader | Специализированный интерфейс, облегчающий расширение |
| XmlWriter | Специализированный интерфейс, облегчающий расширение |
| Класс | Описание |
|---|---|
| SyncFactory | Механизм службы поставщика (SPI), генерирующий экземпляры |
| SyncProvider | Механизм синхронизации, предоставляющий возможности чтения/записи для объектов |
| Исключение | Описание |
|---|---|
| SyncFactoryException | Указывает ошибку с механизмом |
| SyncProviderException | Указывает ошибку с механизмом |
Описание пакета javax.sql.rowset.spi
Стандартные классы и интерфейсы, которые должен использовать поставщик третьей стороны при реализации поставщика синхронизации. Эти классы и интерфейсы называются интерфейсом службы поставщика (SPI). Поставщик может включить свою реализацию на веб-странице JDBC, которая перечисляет доступные реализации SyncProvider с помощью отправки электронного письма на адрес jdbc@sun.com. Это помогает сделать разработчиков осведомленными об реализации. Для того, чтобы объект 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. Записывающий, объект RowSetWriter или XMLWriter, записывает изменения обратно в базу данных при вызове метода CachedRowSet acceptChanges.
Процесс записи изменений в объекте RowSet в его базу данных известен как синхронизация. Реализация SyncProvider, используемая объектом RowSet, определяет уровень синхронизации, используемый записывающим элементом объекта RowSet. Различные уровни синхронизации называются степенями.
Более низкие уровни синхронизации известны как оптимистические уровни конкурентности, потому что они оптимистично предполагают, что конфликтов будет мало или их не будет вообще. Конфликт возникает, когда одни и те же данные, измененные в объекте RowSet , также были изменены в базе данных. Использование оптимистической модели конкурентности означает, что если конфликт возникнет, изменения, внесенные либо в базу данных, либо в объект RowSet , будут утеряны.
Более высокие уровни синхронизации называются пессимистическими, потому что они предполагают, что другие будут обращаться к базе данных и вносить изменения. Эти уровни устанавливают различные уровни блокировок, чтобы повысить вероятность предотвращения конфликтов.
Самый низкий уровень синхронизации — это просто запись любых изменений, внесенных в объект RowSet , в базу данных. Записывающий элемент не выполняет никаких проверок на наличие конфликтов. Если возникает конфликт и значения из базы данных перезаписываются, изменения, внесенные другими сторонами в базу данных, теряются.
Реализация RIXMLProvider использует самый низкий уровень синхронизации и просто записывает изменения RowSet в базу данных. Это верно, потому что обычно базы данных XML не поддерживают технику транзакций для обеспечения целостности данных. Однако определенные группы стандартов рассматривали возможность предоставления XML-основанной синхронизации. Для получения подробной информации см.
http://www.syncml.org
На следующий уровень выше, записывающий элемент проверяет наличие конфликтов и, если они есть, ничего не записывает в базу данных. Проблема с этим уровнем конкурентности заключается в том, что если другая сторона изменила соответствующие данные в базе данных с момента получения данными объектом 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 выбор механизмов синхронизации. Поставщик может сделать свою реализацию доступной, зарегистрировав полное имя класса в корпорации Oracle по адресу jdbc@sun.com. Этот процесс подробно обсуждается ниже.
Интерфейс поставщика сервисов предоставляет подключаемый механизм, посредством которого реализации 2.2 Регистрация в Реализация Подробное описание того, как указать свойства системы или свойства в файле свойств, а также как настроить контекст JNDI, приведено в описании класса 2.3 Политики генерации экземпляров поставщика SyncFactory Эти политики более подробно описаны в классе 2.0 Архитектура интерфейса поставщика сервисов
2.1 Обзор
SyncProvider могут быть зарегистрированы, а затем сгенерированы по требованию. Механизм ленивой ссылки, используемый SyncFactory , ограничивает необоснованное потребление ресурсов, не создавая экземпляр до тех пор, пока он не потребуется объектом RowSet . Класс SyncFactory также предоставляет стандартный API для настройки параметров ведения журнала и потоков, которые могут предоставляться конкретной реализацией SyncProvider . SyncFactory SyncProvider от третьей стороны должна быть зарегистрирована в SyncFactory , чтобы объект RowSet получил доступ к ней и, таким образом, использовал её реализации javax.sql.RowSetReader и javax.sql.RowSetWriter . Все реализации SyncProvider имеют доступ к следующим механизмам регистрации:
SyncProvider .
SyncFactory попытается загрузить объекты SyncProvider , привязанные к контексту, и зарегистрировать их в фабрике. Этот контекст должен быть предоставлен SyncFactory для правильной работы механизма. SyncFactory . SyncFactory генерирует запрошенный объект SyncProvider , если поставщик был корректно зарегистрирован. При создании объекта RowSet с указанной реализацией SyncProvider или его переконфигурации во время выполнения с альтернативной реализацией SyncProvider соблюдаются следующие политики:
SyncProvider , а SyncFactory не содержит ссылки на поставщика, выбрасывается исключение SyncFactoryException .
SyncProvider , а SyncFactory содержит ссылку на поставщика, предоставляется запрашиваемый поставщик.
SyncProvider не указан, предоставляется поставщик реализации по умолчанию RIOptimisticProvider . SyncFactory .
Реализация Кроме того, необходимо следовать соглашению об именовании 3.2 Уровни JSR 114 определяет набор уровней для описания качества синхронизации, которые объект 3.3 Блокировки JSR 114 определяет набор констант, которые указывают, были ли установлены какие-либо блокировки на базовом источнике данных объекта Эти константы должны рассматриваться как дополнительные к константам уровня. Значение по умолчанию для большинства настроек уровня требует, чтобы блокировки источника данных не оставались, когда объект 3.4 Обновляемые представления Объект 3.5 Использование оценки В примере ниже, реализация Объект Интерфейс Когда вызывается метод Затем приложение может использовать методы Комментарий к интерфейсу Руководство разработчика SyncProvider 3.0
3.1 Требования
SyncProvider, полностью подключаемая к SyncFactory, должна расширять и реализовывать все абстрактные методы класса SyncProvider. Кроме того, реализация должна определить параметры уровня, блокировки и возможности обновляемого представления, определённые в описании класса SyncProvider. Должны поддерживаться один или несколько критериев описания SyncProvider. Ожидается, что реализации поставщиков предложат различные уровни, блокировки и возможности обновляемого представления. SyncProvider, как подробно описано в описании класса SyncProvider. SyncProvider может предложить объекту RowSet без подключения. Эти уровни перечислены от низшего качества обслуживания к высшему.
SyncProvider, возвращающая этот уровень, просто попытается записать в исходный источник данных любые изменённые данные из объекта RowSet, перезаписывая имеющиеся данные. Не предпринимается попытка сравнить исходные значения с текущими значениями, чтобы определить конфликт. Реализация RIXMLProvider использует этот уровень.
SyncProvider, возвращающая этот уровень, проверит конфликты в строках, которые были изменены между последней синхронизацией и текущей. Любые изменения в исходном источнике данных, которые были изменены, не будут отражены в объекте RowSet без подключения. Если конфликтов нет, изменения в объекте RowSet будут записаны в источник данных. Если конфликты есть, изменения не записываются. Реализация RIOptimisticProvider использует этот уровень.
SyncProvider, возвращающая этот уровень, проверит все строки, включая те, которые не были изменены в объекте RowSet без подключения. Таким образом, любые изменения строк в базовом источнике данных будут отражены в объекте RowSet без подключения, когда синхронизация завершится успешно.
SyncProvider, возвращающие этот уровень, заблокируют строку в исходном источнике данных, соответствующую строке, изменяемой в объекте RowSet, чтобы снизить вероятность изменения одних и тех же данных в источнике данных другими процессами.
SyncProvider, возвращающая этот уровень, заблокирует всё представление и/или таблицу, затронутые исходным запросом, используемым для заполнения объекта RowSet.RowSet и, если да, то на каких конструкциях установлены блокировки. Эти блокировки останутся в источнике данных, пока объект RowSet не подключен к источнику данных. RowSet отключен от своего источника данных. Уровни GRADE_LOCK_WHEN_MODIFIED и GRADE_LOCK_WHEN_LOADED позволяют объекту RowSet без подключения иметь тонкую настройку степени блокировки.
SyncProvider, если не указано иначе объектом RowSet .
RowSet.
RowSet.
RowSet.RowSet может быть заполнен данными из SQL-VIEW. Следующие константы указывают, может ли объект SyncProvider обновлять данные в таблице или таблицах, из которых был получен VIEW.
SyncProvider поддерживает синхронизацию с таблицей или таблицами, из которых был получен SQL-VIEW , используемый для заполнения объекта RowSet.
SyncProvider не поддерживает синхронизацию с таблицей или таблицами, из которых был получен SQL-VIEW , используемый для заполнения объекта RowSet. 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 Связанная документация
© 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.