Пакет javax.sql.rowset.spi

Стандартные классы и интерфейсы, которые должен использовать поставщик третьей стороны при реализации поставщика синхронизации. Эти классы и интерфейсы называются интерфейсом поставщика сервиса (SPI). Чтобы объект RowSet мог использовать реализацию, поставщик должен зарегистрировать её в SyncFactory синглтоне. (См. комментарий к классу SyncProvider для полного объяснения процесса регистрации и используемой конвенции именования.)

Содержание

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 для правильной работы механизма.
Подробное описание того, как указать свойства системы или свойства в файле свойств, и как настроить контекст 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 Уровни (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

Специализированный интерфейс, который облегчает расширение абстрактного класса SyncProvider стандартного класса, чтобы он имел более тонкую настройку управления транзакциями.

XmlReader

Специализированный интерфейс, облегчающий расширение абстрактного класса SyncProvider для поставщиков синхронизации, ориентированных на XML.

XmlWriter

Специализированный интерфейс, облегчающий расширение абстрактного класса SyncProvider для поставщиков синхронизации, ориентированных на XML.

Класс Описание
SyncFactory

Механизм службы поставщика интерфейсов (SPI), который генерирует экземпляры SyncProvider для использования объектами разобщённых RowSet объектов.

SyncProvider

Механизм синхронизации, предоставляющий возможности чтения/записи для объектов разобщённых RowSet объектов.

Исключение Описание
SyncFactoryException

Указывает ошибку в механизме SyncFactory.

SyncProviderException

Указывает ошибку в механизме SyncProvider.

© 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

Spec-Zone .ru
спецификации, руководства, описания, API