JavaTM 2 Platform
Standard Ed. 6

javax.sql.rowset.spi
介面 SyncResolver

所有父級介面:
ResultSet, RowSet, Wrapper

public interface SyncResolver
extends RowSet

定義一個框架,當發生同步衝突時,它允許應用程序使用手工決策階層樹來確定應該執行的操作。雖然應用程序手工解決同步衝突並不是委託過程,但此框架還是提供了一些發生衝突時委託應用程序的方法。

注意,衝突是指 RowSet 物件的原始行值與資料源中的值不比對的情況,它指示自最後一次同步以來資料源行已被修改。還要注意,RowSet 物件的原始值就是最後一次同步之前的值,不必是其初始值。

SyncResolver 物件的描述

SyncResolver 物件是實作 SyncResolver 介面的專用 RowSet 物件。它可以以連接的 RowSet 物件(JdbcRowSet 介面的實作)或非連接 RowSet 物件(CachedRowSet 介面或其一個子介面的實作)的形式進行操作。有關子介面的資訊,請參閱 javax.sql.rowset 套件描述。SyncResolver 的參考實作實作了 CachedRowSet 介面,但是其他實作可以選擇實作 JdbcRowSet 介面,以滿足特定的需要。

應用程序嘗試使 RowSet 物件與資料源同步(通過調用 CachedRowSet 方法 acceptChanges),並且找到一個或多個衝突之後,rowset 的 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)追蹤存在衝突的每個行中的衝突。它還可以鎖定受 rowset 命令影響的表,以便在解決當前衝突時不再發生其他衝突。

可以從 SyncResolver 物件獲取以下幾種資訊:

  • 發生衝突時正試圖進行的操作
    SyncProvider 介面定義了四個常數來描述可能發生的狀態。其中三個常數描述發現衝突時 RowSet 物件正試圖執行的操作型別(更新、刪除或插入),第四個常數指示不存在衝突。當 SyncResolver 物件調用方法 getStatus 時,這些常數都是可能的返回值。
         int operation = resolver.getStatus();
     

  • 資料源中導致衝突的值
    RowSet 物件更改並嘗試寫入到資料源的值自上一次同步以來也在資料源中被更改時,會發生衝突。應用程序可以調用 SyncResolver 的方法 getConflictValue來獲取資料源中導致衝突的值,因為 SyncResolver 物件中的值是取自資料源的衝突值。
         java.lang.Object conflictValue = resolver.getConflictValue(2);
     
    注意,resolver 中的列可以使用列號指定(如以上程式碼行中所示),也可以用列名稱指定。

    使用從方法 getStatusgetConflictValue 獲取到的資訊,應用程序可以做出應在資料源中保留哪一個值的決定。然後,應用程序調用 SyncResolver 的方法 setResolvedValue,它可以設置 RowSet 物件中和資料源中要保留的值。

         resolver.setResolvedValue("DEPT", 8390426);
     
    在以上程式碼行中,列名稱指定 RowSet 物件中要使用給定值設置的列。也可以用列號來指定列。

    解決當前衝突行中的所有衝突之後,應用程序會調用方法 setResolvedValue,並對 SyncResolver 物件中每個衝突行重複此過程。

    導航 SyncResolver 物件

    因為 SyncResolver 物件是 RowSet 物件,所以應用程序可以使用所有的 RowSet 方法移動指針來導航 SyncResolver 物件。例如,應用程序可以使用 RowSet 的方法 next 到達每個行,然後調用 SyncResolver 的方法 getStatus 查看行是否包含衝突。在具有一個或多個衝突的行中,應用程序可以迭代列來尋找任何非 null 值,它將是資料源中處於衝突狀態的值。

    要使導航 SyncResolver 物件更容易,尤其是存在大量沒有衝突的行時,SyncResolver 介面定義了方法 nextConflictpreviousConflict,它們只移動到至少包含一個衝突值的行。然後,應用程序通過提供列號作為參數調用 SyncResolver 的方法 getConflictValue,以獲取衝突值本身。下一節中的程式碼片段給出了一個範例。

    程式碼範例

    以下程式碼片段演示非連接 RowSet 物件 crs 如何嘗試使自已與底層資料源同步,然後解決衝突。在 try 塊中,crs 調用方法 acceptChanges,將 Connection 物件 con 傳遞給它。如果不存在衝突,則將 crs 中的更改寫入到資料源即可。但是,如果存在衝突,則方法 acceptChanges 將拋出 SyncProviderException 物件,catch 塊生效。在此範例中,闡述了多種 SyncResolver 物件使用方式中的一種,在 while 循環中,使用 SyncResolver 的方法 nextConflictnextConflict 返回 false 時循環將終止,這發生在 SyncResolver 物件 resolver 中不再有衝突行時。在此特定的程式碼片段中,resolver 尋找有更新衝突的行(狀態為 SyncResolver.UPDATE_ROW_CONFLICT 的行),此程式碼片段其餘部分僅執行由於 crs 嘗試更新而發生衝突的行。

    resolver 的指針移動到有更新衝突的下一個衝突行之後,方法 getRow 指示當前行的數字,並且將 CachedRowSet 物件 crs 的指針移到 crs 中的對等行。通過迭代 resolvercrs 中行的列,可以獲取和比較衝突值,以確定應保留哪一個值。在此程式碼片段中,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 設置為將同步的 RowSet 物件當前行中第 index 列的值。
     void setResolvedValue(String columnName, Object obj)
              將 obj 設置為將同步的 RowSet 物件當前行中列 columnName 的值。
     
    從介面 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, 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, 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_CONFLICTSyncResolver.DELETE_ROW_CONFLICTSyncResolver.INSERT_ROW_CONFLICTSyncResolver.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 設置為將同步的 RowSet 物件當前行中第 index 列的值。將 obj 內部地設置為資料源中的值。

    參數:
    index - 一個 int,它提供要設置保留值的列號
    obj - 一個 Object,它是在 RowSet 物件中設置的值,將它保留在資料源中
    拋出:
    SQLException - 如果發生資料庫存取錯誤

    setResolvedValue

    void setResolvedValue(String columnName,
                          Object obj)
                          throws SQLException
    obj 設置為將同步的 RowSet 物件當前行中列 columnName 的值。將 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

    JavaTM 2 Platform
    Standard Ed. 6

    提交錯誤或意見

    版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only