Spec-Zone.ru › OpenJDK 25

Пакет 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 при вызове методов CachedRowSet или 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 или прочитать из него. Реализация 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 Градации

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
  • API журналирования Java

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

  • DataSource для подключений JDBC
Начиная с версии:
1.5
Пакет Описание
javax.sql.rowset
Стандартные интерфейсы и базовые классы для реализаций RowSet JDBC.
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.

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

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

Spec-Zone.ru

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