Интерфейс 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 |
Возвращает значение в указанном столбце текущей строки этого объекта SyncResolver — значение в источнике данных, вызвавшее конфликт. |
Object |
getConflictValue |
Возвращает значение в указанном столбце текущей строки этого объекта SyncResolver — значение в источнике данных, вызвавшее конфликт. |
int |
getStatus() |
Возвращает статус конфликта для текущей строки этого SyncResolver, указывающий операцию, которую пытался выполнить объект RowSet при возникновении конфликта. |
boolean |
nextConflict() |
Перемещает курсор вниз от текущей позиции к следующей строке, содержащей конфликтующее значение. |
boolean |
previousConflict() |
Перемещает курсор вверх от текущей позиции к предыдущей строке с конфликтом в этом объекте SyncResolver. |
void |
setResolvedValue |
Устанавливает obj в качестве значения столбца index текущей строки объекта RowSet, синхронизируемого в данный момент. |
void |
setResolvedValue |
Устанавливает 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
RowSet, синхронизируемого в данный момент. Внутренне obj устанавливается как значение в источнике данных.- Параметры:
-
index—int, задающий номер столбца, в который следует установить значение для сохранения -
obj—Object, являющийся значением, которое следует установить в объектеRowSetи сохранить в источнике данных - Выбрасывает:
-
SQLException— если произошла ошибка доступа к базе данных
setResolvedValue
void setResolvedValue(String columnName, Object obj) throws SQLException
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, 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