Spec-Zone.ru › OpenJDK 17

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

пакет 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 для корректной работы механизма.

Подробное объяснение того, как задавать системные свойства или свойства в файле свойств, и как настроить контекст JNDI, приведено в описании класса SyncFactory.

2.3 Политики генерации экземпляров поставщика SyncFactory

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

  • Если объект SyncProvider указан и SyncFactory не содержит ссылки на поставщика, выбрасывается исключение SyncFactoryException .
  • Если объект SyncProvider указан и SyncFactory содержит ссылку на поставщика, предоставляется запрашиваемый поставщик.
  • Если объект SyncProvider не указан, предоставляется поставщик по умолчанию RIOptimisticProvider .

Эти политики более подробно рассмотрены в классе SyncFactory.

3.0 Руководство для разработчиков реализаций

3.1 Требования

Реализующее 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 Связанная документация

  • DataSource для подключений 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, 2021, 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/17/docs/api/java.sql.rowset/javax/sql/rowset/spi/package-summary.html

Spec-Zone.ru

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