Spec-Zone.ru › OpenJDK 25

Интерфейс 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, чтобы проверить, содержит ли строка конфликт. В строке с одним или несколькими конфликтами приложение может перебрать столбцы и найти все ненулевые значения — это будут конфликтующие значения из источника данных.

Для упрощения навигации по объекту 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 пытался обновить строку в источнике данных.

Поля, объявленные в интерфейсе 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, синхронизируемого в данный момент.

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

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

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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по 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/SyncResolver.html

Spec-Zone.ru

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