Spec-Zone.ru › OpenJDK 8

Интерфейс SyncResolver

Все суперинтерфейсы:
AutoCloseable, ResultSet, RowSet, Wrapper

public interface SyncResolver
extends RowSet

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

Обратите внимание, что конфликт — это ситуация, когда исходные значения объекта RowSet для строки не совпадают со значениями в источнике данных, что указывает на то, что строка источника данных была изменена с момента последней синхронизации. Также обратите внимание, что исходные значения объекта RowSet — это значения, которые у него были непосредственно перед последней синхронизацией, которые не обязательно являются его начальными значениями.

Описание объекта SyncResolver

Объект SyncResolver — это специализированный объект RowSet, который реализует интерфейс SyncResolver. Он может работать как подключенный объект RowSet (реализация интерфейса JdbcRowSet) или как подключенный объект RowSet (реализация интерфейса CachedRowSet или одного из его подинтерфейсов). Сведения о подинтерфейсах см. в описании пакета javax.sql.rowset. Реализация справки для объекта SyncResolver реализует интерфейс CachedRowSet, но другие реализации могут выбрать реализацию интерфейса JdbcRowSet для удовлетворения конкретных потребностей.

После того, как приложение попыталось синхронизировать объект RowSet с источником данных (вызвав метод CachedRowSet acceptChanges), и было обнаружено одно или несколько конфликтов, объект SyncProvider набора строк создаёт экземпляр SyncResolver. Этот новый объект SyncResolver имеет то же количество строк и столбцов, что и объект RowSet , который пытался выполнить синхронизацию. Объект SyncResolver содержит значения из источника данных, которые вызвали конфликт(ы), и null для всех других значений. Кроме того, он содержит информацию о каждом конфликте.

Получение и использование объекта SyncResolver

Когда метод acceptChanges сталкивается с конфликтами, объект SyncProvider создает объект SyncProviderException и задает ему новый объект SyncResolver. Метод acceptChanges выбросит это исключение, которое приложение может перехватить и использовать для извлечения содержащегося в нём объекта SyncResolver . Следующий фрагмент кода использует метод SyncProviderException getSyncResolver для получения объекта SyncResolver resolver.
catch (SyncProviderException spe) {
         SyncResolver resolver = spe.getSyncResolver();
     ...
     }

 }

Имея resolver под рукой, приложение может использовать его для получения содержащейся в нём информации о конфликте или конфликтах. Объект SyncResolver , такой как resolver, отслеживает конфликты для каждой строки, в которой есть конфликт. Он также накладывает блокировку на таблицу или таблицы, затронутые командой набора строк, чтобы избежать возникновения новых конфликтов во время разрешения текущих конфликтов.

Следующие виды информации можно получить из объекта SyncResolver :

Какая операция выполнялась при возникновении конфликта

Интерфейс SyncProvider определяет четыре константы, описывающие состояния, которые могут возникнуть. Три константы описывают тип операции (обновление, удаление или вставка), которую объект RowSet пытался выполнить при обнаружении конфликта, а четвёртая указывает, что конфликта нет. Эти константы являются возможными значениями возврата, когда объект SyncResolver вызывает метод getStatus.
int operation = resolver.getStatus();

Значение в источнике данных, вызвавшее конфликт

Конфликт возникает, когда значение, которое изменил объект RowSet и пытается записать в источник данных, также было изменено в источнике данных с момента последней синхронизации. Приложение может вызвать метод SyncResolver getConflictValue для получения значения в источнике данных, являющегося причиной конфликта, поскольку значения в объекте SyncResolver — это конфликтные значения из источника данных.
java.lang.Object conflictValue = resolver.getConflictValue(2);
Обратите внимание, что столбец в resolver можно указать по номеру столбца, как это сделано в предыдущей строке кода, или по имени столбца.

Имея информацию, полученную из методов getStatus и getConflictValue, приложение может определить, какое значение следует сохранить в источнике данных. Затем приложение вызывает метод SyncResolver setResolvedValue, который задаёт значение, подлежащее сохранению, в объекте RowSet и также в источнике данных.

resolver.setResolvedValue("DEPT", 8390426);
В предыдущей строке кода имя столбца указывает столбец в объекте RowSet , который должен быть задан данным значением. Также можно использовать номер столбца для указания столбца.

Приложение вызывает метод setResolvedValue после разрешения всех конфликтов в текущей строке конфликта и повторяет этот процесс для каждой строки конфликта в объекте SyncResolver .

Перемещение по объекту SyncResolver

Поскольку объект SyncResolver является объектом RowSet, приложение может использовать все методы RowSet для перемещения курсора для перемещения по объекту SyncResolver . Например, приложение может использовать метод RowSet next для перехода к каждой строке, а затем вызвать метод SyncResolver getStatus для проверки, содержит ли строка конфликт. В строке с одним или несколькими конфликтами приложение может перебирать столбцы, чтобы найти любые значения, отличные от null, которые будут значениями из источника данных, находящимися в конфликте.

Для упрощения перемещения по объекту SyncResolver , особенно при большом количестве строк без конфликтов, интерфейс SyncResolver определяет методы nextConflict и previousConflict, которые перемещаются только в строки, содержащие по крайней мере одно значение конфликта. Затем приложение может вызвать метод SyncResolver getConflictValue, передав ему номер столбца, чтобы получить само значение конфликта. Фрагмент кода в следующем разделе демонстрирует пример.

Пример кода

Следующий фрагмент кода демонстрирует, как отключенный объект RowSet crs может попытаться выполнить синхронизацию с основным источником данных, а затем разрешить конфликты. В блоке try, crs вызывает метод acceptChanges, передавая ему объект Connection con. Если конфликтов нет, изменения в crs просто записываются в источник данных. Однако, если конфликт есть, метод acceptChanges выбрасывает объект SyncProviderException, и срабатывает блок catch . В этом примере, который иллюстрирует один из многих способов использования объекта SyncResolver, в цикле while используется метод SyncResolver nextConflict. Цикл завершится, когда nextConflict вернёт false, что произойдёт, когда в объекте SyncResolver resolver не останется строк конфликта. В этом конкретном фрагменте кода resolver ищет строки с конфликтами обновлений (строки со статусом SyncResolver.UPDATE_ROW_CONFLICT), и остальная часть этого фрагмента кода выполняется только для строк, где конфликты произошли, потому что crs пытался выполнить обновление.

После того, как курсор для resolver переместился на следующую строку конфликта, имеющую конфликт обновления, метод getRow указывает номер текущей строки, а курсор для объекта CachedRowSet crs перемещается в сопоставимую строку в crs. Перебирая столбцы этой строки в resolver и crs, можно получить конфликтные значения и сравнить их, чтобы определить, какое из них следует сохранить. В этом фрагменте кода значение в crs устанавливается как разрешенное значение, что означает, что оно будет использовано для перезаписи значения конфликта в источнике данных.

try {

         crs.acceptChanges(con);

     } catch (SyncProviderException spe) {

         SyncResolver resolver = spe.getSyncResolver();

         Object crsValue;  // value in the RowSet object
         Object resolverValue:  // value in the SyncResolver object
         Object resolvedValue:  // value to be persisted

         while(resolver.nextConflict())  {
             if(resolver.getStatus() == SyncResolver.UPDATE_ROW_CONFLICT)  {
                 int row = resolver.getRow();
                 crs.absolute(row);

                 int colCount = crs.getMetaData().getColumnCount();
                 for(int j = 1; j <= colCount; j++) {
                     if (resolver.getConflictValue(j) != null)  {
                         crsValue = crs.getObject(j);
                         resolverValue = resolver.getConflictValue(j);
                         . . .
                         // compare crsValue and resolverValue to determine
                         // which should be the resolved value (the value to persist)
                         resolvedValue = crsValue;

                         resolver.setResolvedValue(j, resolvedValue);
                      }
                  }
              }
          }
      }

Поля

Модификатор и тип Поле и описание
static int DELETE_ROW_CONFLICT

Указывает, что конфликт произошёл, когда объект RowSet пытался удалить строку в источнике данных.

static int INSERT_ROW_CONFLICT

Указывает, что конфликт произошёл, когда объект RowSet пытался вставить строку в источник данных.

static int NO_ROW_CONFLICT

Указывает, что никакого конфликта не произошло, когда объект RowSet пытался обновить, удалить или вставить строку в источник данных.

static int UPDATE_ROW_CONFLICT

Указывает, что конфликт произошел, когда объект RowSet пытался обновить строку в источнике данных.

Поля, унаследованные от интерфейса java.sql.ResultSet

CLOSE_CURSORS_AT_COMMIT, CONCUR_READ_ONLY, CONCUR_UPDATABLE, FETCH_FORWARD, FETCH_REVERSE, FETCH_UNKNOWN, HOLD_CURSORS_OVER_COMMIT, TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE

Методы

Модификатор и тип Метод и описание
Object getConflictValue(int index)

Возвращает значение в указанном столбце в текущей строке этого объекта SyncResolver, которое является значением в источнике данных, вызвавшим конфликт.

Object getConflictValue(String columnName)

Возвращает значение в указанном столбце в текущей строке этого объекта SyncResolver, которое является значением в источнике данных, вызвавшим конфликт.

int getStatus()

Возвращает состояние конфликта текущей строки этого объекта SyncResolver, которое указывает операцию, которую объект RowSet пытался выполнить при возникновении конфликта.

boolean nextConflict()

Перемещает курсор вниз от его текущего положения к следующей строке, содержащей значение конфликта.

boolean previousConflict()

Перемещает курсор вверх от его текущего положения к предыдущей строке конфликта в этом объекте SyncResolver.

void setResolvedValue(int index, Object obj)

Устанавливает obj в качестве значения в столбце index в текущей строке объекта RowSet, который синхронизируется.

void setResolvedValue(String columnName, Object obj)

Устанавливает obj в качестве значения в столбце columnName в текущей строке объекта RowSet, который синхронизируется.

Методы, унаследованные от интерфейса javax.sql.RowSet

addRowSetListener, clearParameters, execute, getCommand, getDataSourceName, getEscapeProcessing, getMaxFieldSize, getMaxRows, getPassword, getQueryTimeout, getTransactionIsolation, getTypeMap, getUrl, getUsername, isReadOnly, removeRowSetListener, setArray, setAsciiStream, setAsciiStream, setAsciiStream, setAsciiStream, setBigDecimal, setBigDecimal, setBinaryStream, setBinaryStream, setBinaryStream, setBinaryStream, setBlob, setBlob, setBlob, setBlob, setBlob, setBlob, setBoolean, setBoolean, setByte, setByte, setBytes, setBytes, setCharacterStream, setCharacterStream, setCharacterStream, setCharacterStream, setClob, setClob, setClob, setClob, setClob, setClob, setCommand, setConcurrency, setDataSourceName, setDate, setDate, setDate, setDate, setDouble, setDouble, setEscapeProcessing, setFloat, setFloat, setInt, setInt, setLong, setLong, setMaxFieldSize, setMaxRows, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNCharacterStream, setNClob, setNClob, setNClob, setNClob, setNClob, setNClob, setNString, setNString, setNull, setNull, setNull, setNull, setObject, setObject, setObject, setObject, setObject, setObject, setPassword, setQueryTimeout, setReadOnly, setRef, setRowId, setRowId, setShort, setShort, setSQLXML, setSQLXML, setString, setString, setTime, setTime, setTime, setTime, setTimestamp, setTimestamp, setTimestamp, setTimestamp, setTransactionIsolation, setType, setTypeMap, setURL, setUrl, setUsername

Методы, унаследованные от интерфейса java.sql.ResultSet

absolute, afterLast, beforeFirst, cancelRowUpdates, clearWarnings, close, deleteRow, findColumn, first, getArray, getArray, getAsciiStream, getAsciiStream, getBigDecimal, getBigDecimal, getBigDecimal, getBigDecimal, getBinaryStream, getBinaryStream, getBlob, getBlob, getBoolean, getBoolean, getByte, getByte, getBytes, getBytes, getCharacterStream, getCharacterStream, getClob, getClob, getConcurrency, getCursorName, getDate, getDate, getDate, getDate, getDouble, getDouble, getFetchDirection, getFetchSize, getFloat, getFloat, getHoldability, getInt, getInt, getLong, getLong, getMetaData, getNCharacterStream, getNCharacterStream, getNClob, getNClob, getNString, getNString, getObject, getObject, getObject, getObject, getObject, getObject, getRef, getRef, getRow, getRowId, getRowId, getShort, getShort, getSQLXML, getSQLXML, getStatement, getString, getString, getTime, getTime, getTime, getTime, getTimestamp, getTimestamp, getTimestamp, getTimestamp, getType, getUnicodeStream, getUnicodeStream, getURL, getURL, getWarnings, insertRow, isAfterLast, isBeforeFirst, isClosed, isFirst, isLast, last, moveToCurrentRow, moveToInsertRow, next, previous, refreshRow, relative, rowDeleted, rowInserted, rowUpdated, setFetchDirection, setFetchSize, updateArray, updateArray, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateAsciiStream, updateBigDecimal, updateBigDecimal, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBinaryStream, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBlob, updateBoolean, updateBoolean, updateByte, updateByte, updateBytes, updateBytes, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateCharacterStream, updateClob, updateClob, updateClob, updateClob, updateClob, updateClob, updateDate, updateDate, updateDouble, updateDouble, updateFloat, updateFloat, updateInt, updateInt, updateLong, updateLong, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNCharacterStream, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNClob, updateNString, updateNString, updateNull, updateNull, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateObject, updateRef, updateRef, updateRow, updateRowId, updateRowId, updateShort, updateShort, updateSQLXML, updateSQLXML, updateString, updateString, updateTime, updateTime, updateTimestamp, updateTimestamp, wasNull

Методы, унаследованные от интерфейса java.sql.Wrapper

isWrapperFor, unwrap

Поля

UPDATE_ROW_CONFLICT

static final int UPDATE_ROW_CONFLICT

Указывает, что произошел конфликт во время попытки объекта RowSet обновить строку в источнике данных. Значения в строке источника данных, которые должны быть обновлены, отличаются от исходных значений объекта RowSet для этой строки, что означает, что строка в источнике данных была обновлена или удалена с момента последней синхронизации.

См. также:
Постоянные значения поля

DELETE_ROW_CONFLICT

static final int DELETE_ROW_CONFLICT

Указывает, что произошел конфликт во время попытки объекта RowSet удалить строку из источника данных. Значения в строке источника данных, которые должны быть обновлены, отличаются от исходных значений объекта RowSet для этой строки, что означает, что строка в источнике данных была обновлена или удалена с момента последней синхронизации.

См. также:
Постоянные значения поля

INSERT_ROW_CONFLICT

static final int INSERT_ROW_CONFLICT

Указывает, что произошел конфликт во время попытки объекта RowSet вставить строку в источник данных. Это означает, что строка с тем же первичным ключом, что и вставляемая строка, была вставлена в источник данных с момента последней синхронизации.

См. также:
Постоянные значения поля

NO_ROW_CONFLICT

static final int NO_ROW_CONFLICT

Указывает, что не произошло конфликта при попытке объекта RowSet обновить, удалить или вставить строку в источник данных. Значения в объекте SyncResolver будут содержать только значения null, как указание, что никакая информация не относится к разрешению конфликтов в этой строке.

См. также:
Постоянные значения поля

Методы

getStatus

int getStatus()

Возвращает состояние конфликта текущей строки этого объекта SyncResolver, которое указывает операцию, которую объект RowSet пытался выполнить при возникновении конфликта.

Возвращает:
одно из следующих констант: SyncResolver.UPDATE_ROW_CONFLICT, SyncResolver.DELETE_ROW_CONFLICT, SyncResolver.INSERT_ROW_CONFLICT, или SyncResolver.NO_ROW_CONFLICT

getConflictValue

Object getConflictValue(int index)
                 throws SQLException

Возвращает значение в указанном столбце в текущей строке этого объекта SyncResolver, которое является значением в источнике данных, вызвавшим конфликт.

Параметры:
index - целое число, обозначающее столбец в этой строке этого объекта SyncResolver для получения значения, вызвавшего конфликт
Возвращает:
значение указанного столбца в текущей строке этого объекта SyncResolver
Исключения:
SQLException - если произошла ошибка доступа к базе данных

getConflictValue

Object getConflictValue(String columnName)
                 throws SQLException

Возвращает значение в указанном столбце в текущей строке этого объекта SyncResolver, которое является значением в источнике данных, вызвавшим конфликт.

Параметры:
columnName - объект String, обозначающий столбец в этой строке этого объекта SyncResolver для получения значения, вызвавшего конфликт
Возвращает:
значение указанного столбца в текущей строке этого объекта SyncResolver
Исключения:
SQLException - если произошла ошибка доступа к базе данных

setResolvedValue

void setResolvedValue(int index,
                      Object obj)
               throws SQLException

Устанавливает obj в качестве значения в столбце index в текущей строке объекта RowSet, который синхронизируется. obj устанавливается как значение в источнике данных внутри.

Параметры:
index - целое число, определяющее номер столбца, в который установить значение для сохранения
obj - объект, являющийся значением, которое необходимо установить в объекте RowSet и сохранить в источнике данных
Исключения:
SQLException - если произошла ошибка доступа к базе данных

setResolvedValue

void setResolvedValue(String columnName,
                      Object obj)
               throws SQLException

Устанавливает obj в качестве значения в столбце columnName в текущей строке объекта RowSet, который синхронизируется. obj устанавливается как значение в источнике данных внутри.

Параметры:
columnName - объект String, указывающий имя столбца, в который установить значение для сохранения
obj - объект, являющийся значением, которое необходимо установить в объекте RowSet и сохранить в источнике данных
Исключения:
SQLException - если произошла ошибка доступа к базе данных

nextConflict

boolean nextConflict()
              throws SQLException

Перемещает курсор вниз от его текущего положения к следующей строке, содержащей значение конфликта. Курсор объекта SyncResolver первоначально расположен перед первой строкой конфликта; первый вызов метода nextConflict делает первую строку конфликта текущей строкой; второй вызов делает вторую строку конфликта текущей строкой и так далее.

Вызов метода nextConflict неявно закроет поток ввода, если он открыт, и очистит цепочку предупреждений объекта SyncResolver.

Возвращает:
true если новая текущая строка допустима; false если больше нет строк
Исключения:
SQLException - если произошла ошибка доступа к базе данных или тип набора результатов TYPE_FORWARD_ONLY

previousConflict

boolean previousConflict()
                  throws SQLException

Перемещает курсор вверх от его текущего положения к предыдущей строке конфликта в этом объекте SyncResolver.

Вызов метода previousConflict неявно закроет поток ввода, если он открыт, и очистит цепочку предупреждений объекта SyncResolver.

Возвращает:
true если курсор находится на допустимой строке; false если он вне набора результатов
Исключения:
SQLException - если произошла ошибка доступа к базе данных или тип набора результатов TYPE_FORWARD_ONLY

© 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