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