JavaTM 2 Platform
Standard Ed. 5.0

javax.sql.rowset.spi
インタフェース SyncResolver

すべてのスーパーインタフェース:
ResultSet, RowSet

public interface SyncResolver
extends RowSet

アプリケーションが、手動の意志決定ツリーを使って同期競合が発生したときの対処方法を決定できるようにするフレームワークを定義します。アプリケーショ ンが同期競合を手動で解決することは必須ではありませんが、このフレームワークは競合が発生したときにアプリケーションに委譲する手段を提供します。

競合とは、RowSet オブジェクトの元の行の値がデータソース内の値と一致しない状態であり、前回の同期以降にデータソース行が変更されたことを示します。RowSet オブジェクトの元の値は、前回の同期の直前の値であり、必ずしも初期値ではありません。

SyncResolver オブジェクトの説明

SyncResolverオブジェクトは、SyncResolverインタフェースを実装する 特殊な RowSetオブジェクトです。 これは接続された RowSetオブジェクト (JdbcRowSetイ ンタフェースの実装) または未接続の RowSetオブジェクト (CachedRowSetイ ンタフェースまたはそのサブインタフェースの実装) として動作できます。サブインタフェースについては、javax.sql.rowsetパッケージの説 明を参照してください。SyncResolverのリファレンス実装は CachedRowSetイ ンタフェースを実装しますが、ほかの実装では、JdbcRowSetインタフェースを実装して、特定の必要を満たすことができ ます。

アプリケーションが (CachedRowSetacceptChanges メソッドを呼び出して) RowSet オブジェクトとデータソースを同期させようとした後、いくつかの競合が発見されると、行セットの SyncProvider オブジェクトは SyncResolver のインスタンスを作成します。この新しい SyncResolver オブジェクトは同期を試みた RowSet オブジェクトと同じ行数および列数になります。SyncResolver オブジェクトには、競合が発生したデータソースの値が格納され、ほかのすべての値には null が格納されます。さらに、各競合の情報も格納されます。

SyncResolver オブジェクトの取得と使用

acceptChangesメソッドが競合を検出すると、SyncProviderオブジェク トは SyncProviderExceptionオブジェクトを作成し、それに新しい SyncResolverオ ブジェクトを設定します。acceptChangesメソッドはこの例外をスローし、それをアプリケーションがキャッチし、格 納されている SyncResolverオブジェクトの取得に使用します。次のコード部分では、SyncProviderExceptiongetSyncResolverメソッドを使用して、SyncResolverオブジェクト resolverを取得します。
 } catch (SyncProviderException spe) { 
     SyncResolver resolver = spe.getSyncResolver();
 ... 
 }

アプリケーションは、resolver を使って、そこに含まれる競合 (複数可) の情報を取得できます。resolver などの SyncResolver オブジェクトは、競合がある各行で、その競合を追跡します。また、行セットのコマンドの影響を受けるテーブル (複数可) にロックを適用して、現在の競合が解決されるまで新たに競合が発生しないようにします。

SyncResolver オブジェクトから取得可能な情報は、次のとおりです。

  • 競合の発生時に試行していた操作
    SyncProvider インタフェースは、発生する可能性のある状態について説明する 4 つの定数を定義します。3 つの定数は、競合が検出されたとき RowSet オブジェクトが試行していた操作の種類 (更新、削除、または挿入) を表し、4 番目は競合がないことを表します。SyncResolver オブジェクトが getStatus メソッドを呼び出したとき、これらの定数が戻り値として返される可能性のあるものです。
     int operation = resolver.getStatus();

  • データソース内の競合の原因となった値
    RowSet オブジェクトによって値が変更され、データソースに書き込まれるとき、書き込み先のデータソース内の値が前回同期処理を行なった時点とは異なっていた場 合、競合が発生したことを表します。SyncResolver オブジェクトの値がデータソースの競合値であるため、アプリケーションは SyncResolvergetConflictValue メソッドを呼び出して、競合の原因となったデータソース内の値を取り出すことができます。
     java.lang.Object conflictValue = resolver.getConflictValue(2);
    resolver の列は、上のコード例のように列番号で指定できます。列名で指定することもできます。

    アプリケーションは、getStatus メソッドおよび getConflictValue メソッドから取得された情報を使って、データソース内に保持すべき値を決定できます。続いて、SyncResolversetResolvedValue メソッドを呼び出して、RowSet オブジェクトおよびデータソースに保持する値を設定します。

     resolver.setResolvedValue("DEPT", 8390426);
    上のコード例では、列名によって、指定の値を設定される RowSet オブジェクト内の列を指定しています。列番号で列を指定することもできます。

    アプリケーションは現在の競合する行のすべての競合を解決したら、setResolvedValue メソッドを呼び出し、SyncResolver オブジェクトの競合する行ごとにこの手順を繰り返します。

    SyncResolver オブジェクトのナビゲート

    SyncResolver オブジェクトは RowSet オブジェクトであるため、アプリケーションはすべての RowSet メソッドを使用して、カーソルを動かし、SyncResolver オブジェクトをナビゲートできます。たとえば、アプリケーションは RowSetnext メソッドを使用して、各行に移動し、SyncResolvergetStatus メソッドを呼び出して、行に競合が含まれるかどうかを確認できます。競合を含む行では、アプリケーションは列で繰り返し処理を行い、null 以外の値を見つけることができます。この値は競合のあるデータソースの値になります。

    SyncResolver オブジェクトのナビゲートを簡単にするには、特に大半の行に競合がない場合に、SyncResolver インタフェースで nextConflict メソッドおよび previousConflict メソッドを定義します。これらのメソッドは、少なくとも 1 つの競合値を含む行のみを移動します。続いてアプリケーションで列番号を指定して、SyncResolvergetConflictValue メソッドを呼び出し、競合値自体を取得します。次のセクションのコードの抜粋に例を示します。

    コード例

    次のコードの抜粋は、未接続の RowSet オブジェクト crs が自身を配下のデータソースと同期することで、競合を解決する方法を示しています。try ブロックで、crsacceptChanges メソッドを呼び出し、Connection オブジェクト con を渡しています。競合がない場合は、単に crs の変更がデータソースに書き込まれます。しかし、競合がある場合は、 acceptChanges メソッドが SyncProviderException オブジェクトをスローし、catch ブロックが有効になります。この例では、SyncResolver オブジェクトを使用した多くの方法のうちの 1 つを説明しており、SyncResolvernextConflict メソッドを while ループで使用しています。nextConflictfalse を返す (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の現在の行の競合ステータスを取得します。
     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, setBigDecimal, setBinaryStream, setBlob, setBoolean, setByte, setBytes, setCharacterStream, setClob, setCommand, setConcurrency, setDataSourceName, setDate, setDate, setDouble, setEscapeProcessing, setFloat, setInt, setLong, setMaxFieldSize, setMaxRows, setNull, setNull, setObject, setObject, setObject, setPassword, setQueryTimeout, setReadOnly, setRef, setShort, setString, setTime, setTime, setTimestamp, setTimestamp, setTransactionIsolation, setType, setTypeMap, 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, getInt, getInt, getLong, getLong, getMetaData, getObject, getObject, getObject, getObject, getRef, getRef, getRow, getShort, getShort, getStatement, getString, getString, getTime, getTime, getTime, getTime, getTimestamp, getTimestamp, getTimestamp, getTimestamp, getType, getUnicodeStream, getUnicodeStream, getURL, getURL, getWarnings, insertRow, isAfterLast, isBeforeFirst, isFirst, isLast, last, moveToCurrentRow, moveToInsertRow, next, previous, refreshRow, relative, rowDeleted, rowInserted, rowUpdated, setFetchDirection, setFetchSize, updateArray, updateArray, updateAsciiStream, updateAsciiStream, updateBigDecimal, updateBigDecimal, updateBinaryStream, updateBinaryStream, updateBlob, updateBlob, updateBoolean, updateBoolean, updateByte, updateByte, updateBytes, updateBytes, updateCharacterStream, updateCharacterStream, updateClob, updateClob, updateDate, updateDate, updateDouble, updateDouble, updateFloat, updateFloat, updateInt, updateInt, updateLong, updateLong, updateNull, updateNull, updateObject, updateObject, updateObject, updateObject, updateRef, updateRef, updateRow, updateShort, updateShort, updateString, updateString, updateTime, updateTime, updateTimestamp, updateTimestamp, wasNull
     

    フィールドの詳細

    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_CONFLICT、 または SyncResolver.NO_ROW_CONFLICT のいずれかの定数


    getConflictValue

    Object getConflictValue(int index)
                            throws SQLException
    この SyncResolverオブジェクトの現在の行にある指定された列の値を取得します。この値が、競合の原因となった データソース内の値です。

    パラメータ:
    index - この SyncResolver オブジェクトのこの行内の列を指定する int。この列から、競合の原因となった値を取得する

    戻り値:
    この SyncResolver オブジェクトの現在の行の指定された列の値

    例外:
    SQLException - デー タベースアクセスエラーが発生した場合


    getConflictValue

    Object getConflictValue(String columnName)
                            throws SQLException
    この SyncResolverオブジェクトの現在の行にある指定された列の値を取得します。この値が、競合の原因となった データソース内の値です。

    パラメータ:
    columnName - こ の SyncResolver オブジェクトのこの行内の列を指定する String オブジェクト。この列から、競合の原因となった値を取得する

    戻り値:
    この SyncResolver オブジェクトの現在の行の指定された列の値

    例外:
    SQLException - デー タベースアクセスエラーが発生した場合


    setResolvedValue

    void setResolvedValue(int index,
                          Object obj)
                          throws SQLException
    objを、同期する RowSetオブジェクトの現在の行の列 index内の値として 設定します。objは、内部でデータソース内に値として設定されます。

    パラメータ:
    index - 列番号を 指定する int。この列に、保持する値を設定する

    obj - RowSet オブジェクトに設定され、データソースに残される値を示す Object

    例外:
    SQLException - デー タベースアクセスエラーが発生した場合


    setResolvedValue

    void setResolvedValue(String columnName,
                          Object obj)
                          throws SQLException
    objを、同期する RowSetオブジェクトの現在の行の列 columnName内 の値として設定します。objは、内部でデータソース内に値として設定されます。

    パラメータ:
    columnName - 列 名を指定する String オブジェクト。この列に、保持する値を設定する

    obj - RowSet オブジェクトに設定され、データソースに残される値を示す Object

    例外:
    SQLException - デー タベースアクセスエラーが発生した場合


    nextConflict

    boolean nextConflict()
                         throws SQLException
    カーソルを現在の位置から、競合する値を含む次の行に移動します。SyncResolverオブジェクトのカーソルは、初期状 態では最初の競合する行の前に位置付けられます。nextConflict()メソッドの最初の呼び出しによって、最初の競合 する行が現在の行になります。2 回目の呼び出しによって 2 番目の競合する行が現在の行になり、以降同様に続きます。

    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. 5.0

    バグの報告と機能のリクエスト
    さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

    Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。