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对象
SyncProvider 实现 RIOptimisticProvider 和 RIXmlProvider,它们满足此要求。
SyncFactory 类提供访问器方法来帮助应用程序确定哪些同步提供程序当前已向 SyncFactory 注册。
其他方法让 RowSet 持久性提供者在工厂机制中注册或注销。这允许额外的同步提供程序实现在运行时可用于 RowSet 对象。
应用程序可以应用一定程度的过滤来确定 SyncProvider 实现提供的同步级别。以下标准确定提供者是否可用于 RowSet 对象:
- 如果特定提供程序由
RowSet对象指定,并且SyncFactory不包含对此提供程序的引用,则会抛出SyncFactoryException指出无法找到同步提供程序。 - 如果
RowSet实现是用指定的提供程序实例化的,并且指定的提供程序已正确注册,则提供请求的提供程序。否则抛出SyncFactoryException。 - 如果
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
- 参见:
-
字段摘要
字段 -
方法总结
修饰符和类型方法描述static SyncProvidergetInstance(String providerID) 返回由 标识的SyncProvider实例提供商ID.static Logger返回应用程序的日志记录对象以检索由 SyncProvider 实现发布的同步事件。static Enumeration<SyncProvider>返回当前注册的同步提供程序的枚举。static SyncFactory返回SyncFactory单例。static voidregisterProvider(String providerID) 将给定的同步提供程序添加到工厂寄存器。static voidsetJNDIContext(Context ctx) 设置初始 JNDI 上下文,从中可以从 JNDI 命名空间检索 SyncProvider 实现static void设置由SyncFactory提供的SyncProvider实现使用的日志记录对象。static void设置由SyncFactorySPI 提供的SyncProvider实现使用的日志记录对象。static voidunregisterProvider(String providerID) 从 Factory SPI 寄存器中删除指定的当前注册的同步提供程序。
-
字段详细信息
-
ROWSET_SYNC_PROVIDER
同步提供程序实现名称的标准属性 ID。- 参见:
-
ROWSET_SYNC_VENDOR
同步提供程序实现供应商名称的标准属性 ID。- 参见:
-
ROWSET_SYNC_PROVIDER_VERSION
同步提供程序实现版本标记的标准属性 ID。- 参见:
-
-
方法详情
-
registerProvider
将给定的同步提供程序添加到工厂寄存器。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
返回SyncFactory单例。- 返回:
SyncFactory实例
-
unregisterProvider
从 Factory SPI 寄存器中删除指定的当前注册的同步提供程序。- 参数:
providerID- 同步提供者的唯一标识- 抛出:
SyncFactoryException- 如果尝试注销未注册的 SyncProvider 实现。
-
getInstance
返回由 标识的SyncProvider实例提供商ID.- 参数:
providerID- 提供商的唯一标识符- 返回:
-
一个
SyncProvider实现 - 抛出:
SyncFactoryException- 如果找不到 SyncProvider,则 providerID 为null,或者在尝试调用此提供程序时遇到错误。
-
getRegisteredProviders
返回当前注册的同步提供程序的枚举。RowSet实现可以使用枚举中的任何提供程序作为其SyncProvider对象。至少,引用同步提供程序允许使用 JDBC 驱动程序存储 RowSet 内容数据应该是可能的。
- 返回:
- 枚举向该工厂注册的可用同步提供程序的枚举
- 抛出:
SyncFactoryException- 如果在获取注册提供者时发生错误
-
setLogger
设置由SyncFactory提供的SyncProvider实现使用的日志记录对象。所有SyncProvider实现都可以将它们的事件记录到该对象,应用程序可以使用getLogger方法检索该对象的句柄。此方法检查是否有一个
SQLPermission对象在允许该方法成功之前授予权限setSyncFactory。如果SecurityManager存在且其checkPermission方法拒绝调用setLogger,则此方法将抛出java.lang.SecurityException。- 参数:
logger- 记录器对象实例- 抛出:
SecurityException- 如果安全管理器存在且其checkPermission方法拒绝调用setLoggerNullPointerException- 如果记录器为空- 参见:
-
setLogger
设置由SyncFactorySPI 提供的SyncProvider实现使用的日志记录对象。所有SyncProvider实现都可以将它们的事件记录到该对象,应用程序可以使用getLogger方法检索该对象的句柄。此方法检查是否有一个
SQLPermission对象在允许该方法成功之前授予权限setSyncFactory。如果SecurityManager存在且其checkPermission方法拒绝调用setLogger,则此方法将抛出java.lang.SecurityException。- 参数:
logger- 一个 Logger 对象实例level- 一个 Level 对象实例,指示所需的日志记录程度- 抛出:
SecurityException- 如果安全管理器存在且其checkPermission方法拒绝调用setLoggerNullPointerException- 如果记录器为空- 参见:
-
getLogger
返回应用程序的日志记录对象以检索由 SyncProvider 实现发布的同步事件。- 返回:
Logger已指定供SyncProvider实现使用- 抛出:
SyncFactoryException- 如果没有设置日志记录对象。
-
setJNDIContext
设置初始 JNDI 上下文,从中可以从 JNDI 命名空间检索 SyncProvider 实现此方法检查是否有一个
SQLPermission对象在允许该方法成功之前授予权限setSyncFactory。如果SecurityManager存在并且其checkPermission方法拒绝调用setJNDIContext,则此方法将抛出java.lang.SecurityException。- 参数:
ctx- 有效的 JNDI 上下文- 抛出:
SyncFactoryException- 如果提供的 JNDI 上下文为空SecurityException- 如果安全管理器存在且其checkPermission方法拒绝调用setJNDIContext- 参见:
-