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

Class 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实现的乐观提供程序或CachedRowSet派生的实现
    • XML提供程序,用于读取和写入XML,例如WebRowSet对象
    请注意,JDBC RowSet实现包括满足此要求的SyncProvider实现RIOptimisticProviderRIXmlProvider

    SyncFactory类提供访问器方法,以帮助应用程序确定当前向SyncFactory注册的同步提供程序。

    其他方法允许RowSet持久性提供程序注册或取消注册工厂机制。 这允许在运行时向RowSet对象提供其他同步提供程序实现。

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

    1. 如果特定提供程序由RowSet对象指定,并且SyncFactory不包含对此提供程序的引用, SyncFactoryException抛出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对象,并使用env进行初始化,其中包含对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
    另请参见:
    SyncProviderSyncFactoryException
    • 字段详细信息

      • ROWSET_SYNC_PROVIDER

        public static final String ROWSET_SYNC_PROVIDER
        同步提供程序实现名称的标准property-id。
        另请参见:
        常数字段值
      • ROWSET_SYNC_VENDOR

        public static final String ROWSET_SYNC_VENDOR
        同步提供程序实现供应商名称的标准property-id。
        另请参见:
        常数字段值
      • ROWSET_SYNC_PROVIDER_VERSION

        public static final String ROWSET_SYNC_PROVIDER_VERSION
        同步提供程序实现版本标记的标准property-id。
        另请参见:
        常数字段值
    • 方法详细信息

      • registerProvider

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

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

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

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

        public static void unregisterProvider​(String providerID)
                                       throws SyncFactoryException
        从Factory SPI寄存器中删除指定的当前注册的同步提供程序。
        参数
        providerID - 同步提供程序的unique-id
        异常
        SyncFactoryException - 如果尝试取消注册未注册的SyncProvider实现。
      • getInstance

        public static SyncProvider getInstance​(String providerID)
                                        throws SyncFactoryException
        返回由 providerID标识的 SyncProvider实例。
        参数
        providerID - 提供者的唯一标识符
        结果
        执行 SyncProvider
        异常
        SyncFactoryException - 如果找不到SyncProvider,则提供者 nullnull ,或者在尝试调用此提供程序时遇到一些错误。
      • getRegisteredProviders

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

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

        结果
        枚举枚举在此Factory中注册的可用同步提供程序
        异常
        SyncFactoryException - 如果获取注册的提供商时发生错误
      • setLogger

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

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

        参数
        logger - Logger对象实例
        异常
        SecurityException - 如果存在安全管理器且其 checkPermission方法拒绝调用 setLogger
        NullPointerException - 如果记录器为空
        另请参见:
        SecurityManager.checkPermission(java.security.Permission)
      • setLogger

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

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

        参数
        logger - Logger对象实例
        level - 一个Level对象实例,指示所需的日志记录程度
        异常
        SecurityException - 如果存在安全管理器且其 checkPermission方法拒绝调用 setLogger
        NullPointerException - 如果记录器为空
        另请参见:
        SecurityManager.checkPermission(java.security.Permission)LoggingPermission
      • 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上下文为null
        SecurityException - 如果存在安全管理器且其 checkPermission方法拒绝调用 setJNDIContext
        另请参见:
        SecurityManager.checkPermission(java.security.Permission)