Spec-Zone.ru › OpenJDK 21

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

package 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 объекта CachedRowSet. Объект записи, RowSetWriter или XMLWriter объект, записывает изменения обратно в исходный источник данных при вызове метода acceptChanges объекта CachedRowSet.

Процесс записи изменений в объект 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 Требования
END_OF_DOCUMENT_MARKER

Реализующая 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 Связанные спецификации

  • JNDI
  • Java Logging APIs

6.0 Связанная документация

  • Источник данных для подключений JDBC
Пакет Описание
javax.sql.rowset
Стандартные интерфейсы и базовые классы для реализаций JDBC RowSet.
javax.sql.rowset.serial
Предоставляет вспомогательные классы для сериализуемых сопоставлений между типами SQL и типами данных в языке программирования Java.
Класс Описание
SyncFactory
Механизм поставщика сервисов (SPI), который генерирует SyncProvider экземпляры для использования объектами отключённого RowSet.
SyncFactoryException
Указывает на ошибку с механизмом SyncFactory.
SyncProvider
Механизм синхронизации, который предоставляет возможности чтения/записи для объектов отключённого RowSet.
SyncProviderException
Указывает на ошибку с механизмом SyncProvider.
SyncResolver
Определяет фреймворк, который позволяет приложениям использовать дерево решений для принятия ручного решения о том, что делать при возникновении конфликта синхронизации.
TransactionalWriter
Специализированный интерфейс, который облегчает расширение стандартного SyncProvider абстрактного класса, чтобы он имел более тонкую гранулированность управления транзакциями.
XmlReader
Специализированный интерфейс, который облегчает расширение SyncProvider абстрактного класса для поставщиков синхронизации, ориентированных на XML.
XmlWriter
Специализированный интерфейс, который облегчает расширение SyncProvider абстрактного класса для поставщиков синхронизации, ориентированных на XML.

© 1993, 2023, 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/21/docs/api/java.sql.rowset/javax/sql/rowset/spi/package-summary.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API