Spec-Zone.ru › OpenJDK 8

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

Стандартные классы и интерфейсы, которые должен использовать поставщик третьей стороны при реализации поставщика синхронизации.

См.: Описание

Интерфейс Описание
SyncResolver

Определяет структуру, позволяющую приложениям использовать дерево решений для определения действий при возникновении конфликта синхронизации.

TransactionalWriter

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

XmlReader

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

XmlWriter

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

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

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

SyncProvider

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

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

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

SyncProviderException

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

Описание пакета 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.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 .

  • Руководство разработчика SyncProvider 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.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 Связанные спецификации

    • JNDI 1.3
    • Java Logging APIs

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

    • Свойства системы
    • Файлы ресурсов
    • Источник данных для подключений JDBC

  • © 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.

    Spec-Zone.ru

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