JavaTM 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인터페이스를 구현해, 특정의 필요를 채울 수가 있습니다.

어플리케이션이 (CachedRowSetacceptChanges메소드를 호출해) RowSet객체와 데이터 소스를 동기 시키려고 한 후, 몇개의 경합이 발견되면(자), 행 세트의 SyncProvider객체는 SyncResolver 의 인스턴스를 작성합니다. 이 새로운 SyncResolver객체는 동기를 시도한 RowSet 객체와 같은 행수 및 렬수가 됩니다. SyncResolver객체에는, 경합이 발생한 데이터 소스의 값이 포함되어 다른 모든 값에는 null가 포함됩니다. 게다가 각 경합의 정보도 포함됩니다.  

SyncResolver 객체의 취득과 사용

acceptChanges메소드가 경합을 검출하면(자),SyncProvider객체는 SyncProviderException객체를 작성해, 거기에 새로운 SyncResolver객체를 설정합니다. acceptChanges메소드는 이 예외를 throw 해, 그것을 어플리케이션이 캐치 해, 포함되고 있는 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 객체를 throw 해,catch블록이 유효하게 됩니다. 이 예에서는,SyncResolver 객체를 사용한 많은 방법 가운데 하나를 설명하고 있어,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 , 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_CONFLICT, SyncResolver.DELETE_ROW_CONFLICT, SyncResolver.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 Platform
    Standard Ed. 6

    버그의 보고와 기능의 요청
    한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

    Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.