Spec-Zone.ru › OpenJDK 17

Интерфейс 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, метод SyncResolver nextConflict используется в цикле while. Цикл завершится, когда 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);
                      }
                  }
              }
          }
      }
 
С:
1.5

Краткое описание полей

Модификатор и тип Поле Описание
static final int DELETE_ROW_CONFLICT
Указывает, что произошел конфликт во время попытки объекта RowSet удалить строку в источнике данных.
static final int INSERT_ROW_CONFLICT
Указывает, что произошел конфликт во время попытки объекта RowSet вставить строку в источник данных.
static final int NO_ROW_CONFLICT
Указывает, что никаких конфликтов не произошло при попытке объекта RowSet обновить, удалить или вставить строку в источник данных.
static final 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 , который синхронизируется.

Методы, объявленные в интерфейсе 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

Методы, объявленные в интерфейсе 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.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 - int , обозначающий столбец в этой строке этого объекта 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 - int , указывающий номер столбца, в который следует установить значение для сохранения
obj - Object , являющийся значением, которое нужно установить в объекте RowSet и сохранить в источнике данных
Выбрасывает:
SQLException - если произошла ошибка доступа к базе данных

setResolvedValue

void setResolvedValue(String columnName, Object obj) throws SQLException
Устанавливает obj в качестве значения в столбце columnName в текущей строке объекта RowSet, который синхронизируется. obj устанавливается как значение в источнике данных внутри.
Параметры:
columnName - объект String , указывающий имя столбца, в который следует установить значение для сохранения
obj - Object , являющийся значением, которое нужно установить в объекте 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, 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/SyncResolver.html

Spec-Zone.ru

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