|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
public interface SyncResolver
定義一個框架,當發生同步衝突時,它允許應用程序使用手工決策階層樹來確定應該執行的操作。雖然應用程序手工解決同步衝突並不是委託過程,但此框架還是提供了一些發生衝突時委託應用程序的方法。
注意,衝突是指 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 中的列可以使用列號指定(如以上程式碼行中所示),也可以用列名稱指定。
使用從方法 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
物件使用方式中的一種,在 while
循環中,使用 SyncResolver
的方法 nextConflict
。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 theRowSet
object Object resolverValue: // value in theSyncResolver
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 物件試圖更新資料源中的行時發生衝突。 |
方法摘要 | |
---|---|
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 的值。 |
從介面 java.sql.Wrapper 繼承的方法 |
---|
isWrapperFor, unwrap |
欄位詳細資訊 |
---|
static final int UPDATE_ROW_CONFLICT
RowSet
物件試圖更新資料源中的行時發生衝突。資料源行中要更新的值不同於該行的 RowSet
物件的原始值,這意味著自上一次同步以來已更新或刪除了資料源中的行。
static final int DELETE_ROW_CONFLICT
RowSet
物件試圖刪除資料源中的行時發生衝突。資料源行中要更新的值不同於該行的 RowSet
物件的原始值,這意味著自上一次同步以來已更新或刪除了資料源中的行。
static final int INSERT_ROW_CONFLICT
RowSet
物件試圖將行插入資料源中時發生衝突。這意味著自上一次同步以來已經在資料源中插入了一個與要插入的行具有相同主鍵的行。
static final int NO_ROW_CONFLICT
RowSet
物件試圖更新、刪除或插入資料源中的行時不發生任何衝突。SyncResolver
中的值將包含 null
值,該值僅指示此行中沒有關於衝突解決的資訊。
方法詳細資訊 |
---|
int getStatus()
SyncResolver
的當前行的衝突狀態,它指示在發生衝突時 RowSet
物件正嘗試的操作。
SyncResolver.UPDATE_ROW_CONFLICT
、SyncResolver.DELETE_ROW_CONFLICT
、SyncResolver.INSERT_ROW_CONFLICT
或 SyncResolver.NO_ROW_CONFLICT
Object getConflictValue(int index) throws SQLException
SyncResolver
物件的當前行中指定列的值,它是資料源中導致衝突的值。
index
- 一個 int
,它指定此 SyncResolver
物件的此行中的列,從該列可以獲取導致衝突的值
SyncResolver
物件的當前行中指定列的值
SQLException
- 如果發生資料庫存取錯誤Object getConflictValue(String columnName) throws SQLException
SyncResolver
物件的當前行中指定列的值,它是資料源中導致衝突的值。
columnName
- String
物件,它指定此 SyncResolver
物件的此行中的列,從該列可以獲取導致衝突的值
SyncResolver
物件的當前行中指定列的值
SQLException
- 如果發生資料庫存取錯誤void setResolvedValue(int index, Object obj) throws SQLException
RowSet
物件當前行中第 index 列的值。將 obj 內部地設置為資料源中的值。
index
- 一個 int
,它提供要設置保留值的列號obj
- 一個 Object
,它是在 RowSet
物件中設置的值,將它保留在資料源中
SQLException
- 如果發生資料庫存取錯誤void setResolvedValue(String columnName, Object obj) throws SQLException
RowSet
物件當前行中列 columnName 的值。將 obj 內部地設置為資料源中的值。
columnName
- String
物件,它提供要設置保留值的列名稱obj
- 一個 Object
,它是在 RowSet
物件中設置的值,將它保留在資料源中
SQLException
- 如果發生資料庫存取錯誤boolean nextConflict() throws SQLException
SyncResolver
物件的指針最初位於第一個衝突行之前;第一次調用 nextConflict
方法使第一個衝突行成為當前行;第二次調用使第二個衝突行成為當前行,依此類別推。
調用方法 nextConflict
將隱式關閉輸入串流(如果有打開的輸入串流),並且將清除 SyncResolver
物件的警告鏈。
true
;如果不存在下一行,則返回 false
SQLException
- 如果發生資料庫存取錯誤,或者結果集型別為 TYPE_FORWARD_ONLY
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。