类 SyncFactory

java.lang.Object
javax.sql.rowset.spi.SyncFactory

public class SyncFactory extends Object
服务提供商接口 (SPI) 机制生成 SyncProvider 实例以供断开连接的 RowSet 对象使用。 SyncProvider 实例反过来提供 javax.sql.RowSetReader 对象, RowSet 对象需要用数据填充自身, javax.sql.RowSetWriter 对象需要将对其数据的更改传播回基础数据源。

因为 SyncFactory 类中的方法都是静态的,所以在任何时候每个 Java VM 只有一个 SyncFactory 对象。这确保了 RowSet 实现可以从单一来源获得其 SyncProvider 实现。

1.0 概述

SyncFactory 类提供可用同步提供程序实现(SyncProvider 对象)的内部注册表。可以查询此注册表以确定哪些同步提供程序可用。以下代码行获取当前注册的提供商的枚举。
   java.util.Enumeration e = SyncFactory.getRegisteredProviders();
 
所有标准 RowSet 实现必须提供至少两个提供程序:
  • CachedRowSet 实现或从它派生的实现一起使用的乐观提供者
  • 一个 XML 提供程序,用于读取和写入 XML,例如使用 WebRowSet 对象
请注意,JDBC RowSet 实现包括 SyncProvider 实现 RIOptimisticProviderRIXmlProvider,它们满足此要求。

SyncFactory 类提供访问器方法来帮助应用程序确定哪些同步提供程序当前已向 SyncFactory 注册。

其他方法让 RowSet 持久性提供者在工厂机制中注册或注销。这允许额外的同步提供程序实现在运行时可用于 RowSet 对象。

应用程序可以应用一定程度的过滤来确定 SyncProvider 实现提供的同步级别。以下标准确定提供者是否可用于 RowSet 对象:

  1. 如果特定提供程序由 RowSet 对象指定,并且 SyncFactory 不包含对此提供程序的引用,则会抛出 SyncFactoryException 指出无法找到同步提供程序。
  2. 如果 RowSet 实现是用指定的提供程序实例化的,并且指定的提供程序已正确注册,则提供请求的提供程序。否则抛出 SyncFactoryException
  3. 如果 RowSet 对象未指定 SyncProvider 实现并且没有其他 SyncProvider 实现可用,则提供参考实现提供程序。

2.0 注册SyncProvider实现

供应商和开发人员都可以使用以下机制之一注册 SyncProvider 实现。

  • 使用命令行
    提供程序的名称在命令行上提供,这会将提供程序添加到系统属性中。例如:
      -Drowset.provider.classname=com.fred.providers.HighAvailabilityProvider
     
  • 使用标准属性文件
    参考实现的目标是随 J2SE 1.5 一起发布,其中将包含一个可以手动编辑的附加资源文件。以下是参考实现中包含的属性文件的示例:
      #Default JDBC RowSet sync providers listing
      #
    
      # Optimistic synchronization provider
      rowset.provider.classname.0=com.sun.rowset.providers.RIOptimisticProvider
      rowset.provider.vendor.0=Oracle Corporation
      rowset.provider.version.0=1.0
    
      # XML Provider using standard XML schema
      rowset.provider.classname.1=com.sun.rowset.providers.RIXMLProvider
      rowset.provider.vendor.1=Oracle Corporation
      rowset.provider.version.1=1.0
     
    SyncFactory 检查此文件并注册它包含的 SyncProvider 实现。开发人员或供应商可以向此文件添加其他实现。例如,这里是一个可能的补充:
       rowset.provider.classname.2=com.fred.providers.HighAvailabilityProvider
       rowset.provider.vendor.2=Fred, Inc.
       rowset.provider.version.2=1.0
     
  • 使用 JNDI 上下文
    可以在 JNDI 上下文中注册可用的提供程序,SyncFactory 将尝试从该 JNDI 上下文加载 SyncProvider 实现。例如,以下代码片段在 JNDI 上下文中注册了一个提供者实现。这是部署人员通常会做的事情。在此示例中,MyProvider 被注册到 CosNaming 名称空间,这是 J2EE 资源使用的名称空间。
      import javax.naming.*;
    
      Hashtable svrEnv = new Hashtable();
      srvEnv.put(Context.INITIAL_CONTEXT_FACTORY, "CosNaming");
    
      Context ctx = new InitialContext(svrEnv);
      com.fred.providers.MyProvider = new MyProvider();
      ctx.rebind("providers/MyProvider", syncProvider);
     
接下来,应用程序将向SyncFactory 实例注册JNDI 上下文。这允许 SyncFactory 在 JNDI 上下文中浏览以查找 SyncProvider 实现。
  Hashtable appEnv = new Hashtable();
  appEnv.put(Context.INITIAL_CONTEXT_FACTORY, "CosNaming");
  appEnv.put(Context.PROVIDER_URL, "iiop://hostname/providers");
  Context ctx = new InitialContext(appEnv);

  SyncFactory.registerJNDIContext(ctx);
 
如果 RowSet 对象试图获取 MyProvider 对象,SyncFactory 将尝试定位它。首先它在系统属性中搜索它,然后它在资源文件中查找,最后它检查已设置的 JNDI 上下文。 SyncFactory 实例验证请求的提供程序是 SyncProvider 抽象类的有效扩展,然后将其提供给 RowSet 对象。在以下代码片段中,创建并初始化了一个新的 CachedRowSet 对象环境,其中包含对 MyProvider 的绑定。
  Hashtable env = new Hashtable();
  env.put(SyncFactory.ROWSET_SYNC_PROVIDER, "com.fred.providers.MyProvider");
  CachedRowSet crs = new com.sun.rowset.CachedRowSetImpl(env);
 
有关这些机制的更多详细信息可在 javax.sql.rowset.spi 包规范中找到。
自从:
1.5
参见:
  • 字段详细信息

    • ROWSET_SYNC_PROVIDER

      public static final String  ROWSET_SYNC_PROVIDER
      同步提供程序实现名称的标准属性 ID。
      参见:
    • ROWSET_SYNC_VENDOR

      public static final String  ROWSET_SYNC_VENDOR
      同步提供程序实现供应商名称的标准属性 ID。
      参见:
    • ROWSET_SYNC_PROVIDER_VERSION

      public static final String  ROWSET_SYNC_PROVIDER_VERSION
      同步提供程序实现版本标记的标准属性 ID。
      参见:
  • 方法详情

    • registerProvider

      public static void registerProvider(String  providerID) throws SyncFactoryException
      将给定的同步提供程序添加到工厂寄存器。 SyncProvider 规范中提供了有关 SyncProvider 实现所需命名约定的指南。

      可以通过将 SyncProvider 实例绑定到 JNDI 名称空间来注册绑定到 JNDI 上下文的同步提供程序。

       
       SyncProvider p = new MySyncProvider();
       InitialContext ic = new InitialContext();
       ic.bind ("jdbc/rowset/MySyncProvider", p);
        
      此外,应使用 setJNDIContext 方法通过 SyncFactory 设置初始 JNDI 上下文。 SyncFactory 利用此上下文来搜索绑定到 JNDI 上下文及其子节点的可用 SyncProvider 对象。
      参数:
      providerID - 具有正在注册的同步提供程序的唯一 ID 的 String 对象
      抛出:
      SyncFactoryException - 如果尝试提供空的或空的提供者名称
      参见:
    • getSyncFactory

      public static SyncFactory  getSyncFactory()
      返回 SyncFactory 单例。
      返回:
      SyncFactory 实例
    • unregisterProvider

      public static void unregisterProvider(String  providerID) throws SyncFactoryException
      从 Factory SPI 寄存器中删除指定的当前注册的同步提供程序。
      参数:
      providerID - 同步提供者的唯一标识
      抛出:
      SyncFactoryException - 如果尝试注销未注册的 SyncProvider 实现。
    • getInstance

      public static SyncProvider  getInstance(String  providerID) throws SyncFactoryException
      返回由 标识的 SyncProvider 实例提供商ID.
      参数:
      providerID - 提供商的唯一标识符
      返回:
      一个SyncProvider实现
      抛出:
      SyncFactoryException - 如果找不到 SyncProvider,则 providerID 为 null,或者在尝试调用此提供程序时遇到错误。
    • getRegisteredProviders

      public static Enumeration <SyncProvider > getRegisteredProviders() throws SyncFactoryException
      返回当前注册的同步提供程序的枚举。 RowSet 实现可以使用枚举中的任何提供程序作为其 SyncProvider 对象。

      至少,引用同步提供程序允许使用 JDBC 驱动程序存储 RowSet 内容数据应该是可能的。

      返回:
      枚举向该工厂注册的可用同步提供程序的枚举
      抛出:
      SyncFactoryException - 如果在获取注册提供者时发生错误
    • setLogger

      public static void setLogger(Logger  logger)
      设置由 SyncFactory 提供的 SyncProvider 实现使用的日志记录对象。所有 SyncProvider 实现都可以将它们的事件记录到该对象,应用程序可以使用 getLogger 方法检索该对象的句柄。

      此方法检查是否有一个 SQLPermission 对象在允许该方法成功之前授予权限 setSyncFactory。如果 SecurityManager 存在且其 checkPermission 方法拒绝调用 setLogger,则此方法将抛出 java.lang.SecurityException

      参数:
      logger - 记录器对象实例
      抛出:
      SecurityException - 如果安全管理器存在且其 checkPermission 方法拒绝调用 setLogger
      NullPointerException - 如果记录器为空
      参见:
    • setLogger

      public static void setLogger(Logger  logger, Level  level)
      设置由 SyncFactory SPI 提供的 SyncProvider 实现使用的日志记录对象。所有 SyncProvider 实现都可以将它们的事件记录到该对象,应用程序可以使用 getLogger 方法检索该对象的句柄。

      此方法检查是否有一个 SQLPermission 对象在允许该方法成功之前授予权限 setSyncFactory。如果 SecurityManager 存在且其 checkPermission 方法拒绝调用 setLogger,则此方法将抛出 java.lang.SecurityException

      参数:
      logger - 一个 Logger 对象实例
      level - 一个 Level 对象实例,指示所需的日志记录程度
      抛出:
      SecurityException - 如果安全管理器存在且其 checkPermission 方法拒绝调用 setLogger
      NullPointerException - 如果记录器为空
      参见:
    • getLogger

      public static Logger  getLogger() throws SyncFactoryException
      返回应用程序的日志记录对象以检索由 SyncProvider 实现发布的同步事件。
      返回:
      Logger 已指定供 SyncProvider 实现使用
      抛出:
      SyncFactoryException - 如果没有设置日志记录对象。
    • setJNDIContext

      public static void setJNDIContext(Context  ctx) throws SyncFactoryException
      设置初始 JNDI 上下文,从中可以从 JNDI 命名空间检索 SyncProvider 实现

      此方法检查是否有一个 SQLPermission 对象在允许该方法成功之前授予权限 setSyncFactory。如果 SecurityManager 存在并且其 checkPermission 方法拒绝调用 setJNDIContext,则此方法将抛出 java.lang.SecurityException

      参数:
      ctx - 有效的 JNDI 上下文
      抛出:
      SyncFactoryException - 如果提供的 JNDI 上下文为空
      SecurityException - 如果安全管理器存在且其 checkPermission 方法拒绝调用 setJNDIContext
      参见: