模块  java.sql.rowset
软件包  javax.sql.rowset.spi

Interface SyncResolver

  • All Superinterfaces:
    AutoCloseableResultSetRowSetWrapper

    public interface SyncResolverextends RowSet
    定义一个框架,允许应用程序使用手动决策树来决定发生同步冲突时应该执行的操作。 虽然应用程序不必手动解决同步冲突,但此框架提供了在发生冲突时委派给应用程序的方法。

    请注意,冲突是RowSet对象的行的原始值与数据源中的值不匹配的情况,这表示自上次同步以来数据源行已被修改。 另请注意, RowSet对象的原始值是它在上次同步之前的值,它们不一定是其初始值。

    SyncResolver对象的描述

    SyncResolver对象是实现SyncResolver接口的专用RowSet对象。 可以作为连接的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对象解析程序
        catch (SyncProviderException spe) {         SyncResolver resolver = spe.getSyncResolver();     ...     } } 

    有了解析器 ,应用程序可以使用它来获取它包含的有关冲突或冲突的信息。 诸如解析器之 SyncResolver对象SyncResolver跟踪存在冲突的每一行的冲突。 它还会锁定受行集命令影响的表或表,以便在解决当前冲突时不会发生更多冲突。

    可以从SyncResolver对象获取以下类型的信息:

    发生冲突时正在尝试什么操作

    SyncProvider接口定义了四个描述可能发生的状态的常量。 三个常量描述了发现冲突时RowSet对象尝试执行的操作类型(更新,删除或插入),第四个表示没有冲突。 SyncResolver对象调用方法getStatus时,这些常量是可能的返回值。
      int operation = resolver.getStatus();  

    导致冲突的数据源中的值

    如果RowSet对象已更改并尝试写入数据源的值自上次同步以来在数据源中也已更改,则存在冲突。 应用程序可以调用SyncResolver方法getConflictValue来检索数据源中导致冲突的值,因为SyncResolver对象中的值是来自数据源的冲突值。
      java.lang.Object conflictValue = resolver.getConflictValue(2); 
    请注意, 解析程序中的列可以通过列号指定,如前一行代码中所示,或者通过列名称指定。

    利用从方法getStatusgetConflictValue检索的信息,应用程序可以确定应该在数据源中保持哪个值。 然后,应用程序调用SyncResolver方法setResolvedValue ,该方法将值设置为RowSetRowSet对象中以及数据源中。

      resolver.setResolvedValue("DEPT", 8390426); 
    在上一行代码中,列名称指定RowSet对象中要使用给定值设置的列。 列号也可用于指定列。

    应用程序在解决了当前冲突行中的所有冲突后调用方法setResolvedValue ,并为SyncResolver对象中的每个冲突行重复此过程。

    浏览SyncResolver对象

    因为SyncResolver对象是RowSet对象,所以应用程序可以使用所有RowSet方法移动光标以导航SyncResolver对象。 例如,应用程序可以使用RowSet方法next到达每一行,然后调用SyncResolver方法getStatus以查看该行是否包含冲突。 在具有一个或多个冲突的行中,应用程序可以遍历列以查找任何非空值,这些值将是来自数据源的冲突值。

    为了更容易导航SyncResolver对象,尤其是当存在大量没有冲突的行时, SyncResolver接口定义方法nextConflictpreviousConflict ,这些方法仅移动到包含至少一个冲突值的行。 然后,应用程序可以调用SyncResolver方法getConflictValue ,为其提供列号,以获取冲突值本身。 下一节中的代码片段给出了一个示例。

    代码示例

    以下代码片段演示了断开连接的RowSet对象crs如何尝试与底层数据源同步,然后解决冲突。 try块中, crs调用方法acceptChanges ,将其传递给Connection对象con 如果没有冲突,则将crs中的更改写入数据源。 但是,如果存在冲突,方法acceptChanges将抛出SyncProviderException对象,并且catch块将生效。 在该示例中,其示出了可以使用SyncResolver对象的许多方式之一, SyncResolver方法nextConflict用于while循环中。 nextConflict返回false ,循环将结束,这将在SyncResolver对象解析器中没有更多冲突行时发生。 在此特定代码片段中, 解析程序查找具有更新冲突的行(状态为SyncResolver.UPDATE_ROW_CONFLICT行),此代码片段的其余部分仅对因crs尝试更新而发生冲突的行执行。

    光标进行分解器已移动到下一个冲突行具有更新冲突之后,该方法getRow指示当前行的数目,并且光标为CachedRowSet对象crs被移动到可比较的行中的CRS。 通过在解析器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
    • 字段详细信息

      • 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 - 一个 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对象的当前行中的列索引中的值。 obj在内部设置为数据源中的值。
        参数
        index - int给出要设置要 int的值的列的编号
        obj - 一个 Object ,它是要在 RowSet对象中设置并 RowSet在数据源中的值
        异常
        SQLException - 如果发生数据库访问错误
      • setResolvedValue

        void setResolvedValue​(String columnName,                      Object obj)               throws SQLException
        obj设置为正在同步的RowSet对象的当前行中columnName列中的值。 obj在内部设置为数据源中的值。
        参数
        columnName - 一个 String对象,给出要在其中设置要 String的值的列的名称
        obj - 一个 Object ,它是要在 RowSet对象中设置并 RowSet在数据源中的值
        异常
        SQLException - 如果发生数据库访问错误
      • nextConflict

        boolean nextConflict()              throws SQLException
        将光标从当前位置向下移动到包含冲突值的下一行。 SyncResolver对象的光标最初位于第一个冲突行之前; 第一次调用方法nextConflict使第一个冲突行成为当前行; 第二个调用使第二个冲突行成为当前行,依此类推。

        如果一个输入流打开并且将清除SyncResolver对象的警告链,则对方法nextConflict调用将隐式关闭输入流。

        结果
        true如果新的当前行有效; false如果没有更多行
        异常
        SQLException - 如果发生数据库访问错误或结果集类型为 TYPE_FORWARD_ONLY
      • previousConflict

        boolean previousConflict()                  throws SQLException
        将光标从当前位置向上移动到此SyncResolver对象中的上一个冲突行。

        如果一个输入流打开并且将清除SyncResolver对象的警告链,则对方法previousConflict调用将隐式关闭输入流。

        结果
        true如果光标在有效行上; false如果它不在结果集中
        异常
        SQLException - 如果发生数据库访问错误或结果集类型为 TYPE_FORWARD_ONLY