RowSet
对象使用的SyncProvider
实例。 SyncProvider
实例反过来提供RowSet
对象需要用于填充自身数据的javax.sql.RowSetReader
对象和需要将数据更改传播回底层数据源的javax.sql.RowSetWriter
对象。
由于SyncFactory
类中的方法都是静态的,因此在任何时候Java虚拟机中只有一个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一起发布,其中将包括一个可以手动编辑的附加资源文件。以下是参考实现中包含的属性文件示例:#默认的JDBC RowSet同步提供者列表 # # 乐观同步提供者 rowset.provider.classname.0=com.sun.rowset.providers.RIOptimisticProvider rowset.provider.vendor.0=Oracle Corporation rowset.provider.version.0=1.0 # 使用标准XML模式的XML提供者 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
的绑定的env进行初始化。
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版本起
- 参见:
-
Field Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic SyncProvider
getInstance
(String providerID) 返回由providerID标识的SyncProvider
实例。static Logger
返回供应用程序检索由SyncProvider实现发布的同步事件的日志对象。static Enumeration
<SyncProvider> 返回当前注册的同步提供者的枚举。static SyncFactory
返回SyncFactory
单例。static void
registerProvider
(String providerID) 将给定的同步提供者添加到工厂注册表中。static void
setJNDIContext
(Context ctx) 设置可从JNDI命名空间中检索SyncProvider实现的初始JNDI上下文static void
设置由SyncFactory
提供的SyncProvider
实现使用的日志对象。static void
设置由SyncFactory
SPI提供的SyncProvider
实现使用的日志对象。static void
unregisterProvider
(String providerID) 从工厂SPI注册中删除指定的当前注册的同步提供者。
-
Field Details
-
ROWSET_SYNC_PROVIDER
同步提供者实现名称的标准属性ID。- 参见:
-
ROWSET_SYNC_VENDOR
同步提供者实现供应商名称的标准属性ID。- 参见:
-
ROWSET_SYNC_PROVIDER_VERSION
同步提供者实现版本标签的标准属性ID。- 参见:
-
-
Method Details
-
registerProvider
将给定的同步提供者添加到工厂注册表中。在SyncProvider
规范中提供了SyncProvider
实现所需命名约定的指导方针。绑定到JNDI上下文的同步提供者可以通过将SyncProvider实例绑定到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
- 如果尝试提供空或null提供者名称 - 参见:
-
getSyncFactory
返回SyncFactory
单例。- 返回:
-
SyncFactory
实例
-
unregisterProvider
从工厂SPI注册中删除指定的当前注册的同步提供者。- 参数:
-
providerID
- 同步提供程序的唯一标识符 - 抛出:
-
SyncFactoryException
- 如果尝试注销未注册的SyncProvider实现。
-
getInstance
返回由providerID标识的SyncProvider
实例。- 参数:
-
providerID
- 提供程序的唯一标识符 - 返回:
-
一个
SyncProvider
实现 - 抛出:
-
SyncFactoryException
- 如果找不到SyncProvider,providerID为null>,或在尝试调用此提供程序时遇到错误。
-
getRegisteredProviders
返回当前注册的同步提供程序的枚举。
RowSet
实现可以使用枚举中的任何提供程序作为其SyncProvider
对象。至少应该可能使用JDBC驱动程序存储RowSet内容数据的参考同步提供程序。
- 返回:
- 枚举 已注册到此工厂的可用同步提供程序的枚举
- 抛出:
-
SyncFactoryException
- 如果获取已注册提供程序时发生错误
-
setLogger
设置
SyncFactory
提供的SyncProvider
实现要使用的日志记录对象。所有SyncProvider
实现都可以将其事件记录到此对象,并且应用程序可以使用getLogger
方法检索此对象的句柄。此方法检查是否存在授予权限
setSyncFactory
的SQLPermission
对象,然后允许方法成功。如果存在SecurityManager
及其checkPermission
方法拒绝调用setLogger
,此方法将抛出java.lang.SecurityException
。- 参数:
-
logger
- 一个Logger对象实例 - 抛出:
-
SecurityException
- 如果存在SecurityManager及其checkPermission方法拒绝调用setLogger
-
NullPointerException
- 如果logger为null - 参见:
-
setLogger
设置由
SyncFactory
SPI提供的SyncProvider
实现使用的日志记录对象。所有SyncProvider
实现都可以将其事件记录到此对象,并且应用程序可以使用getLogger
方法检索此对象的句柄。此方法检查是否存在授予权限
setSyncFactory
的SQLPermission
对象,然后允许方法成功。如果存在SecurityManager
及其checkPermission
方法拒绝调用setLogger
,此方法将抛出java.lang.SecurityException
。- 参数:
-
logger
- 一个Logger对象实例 -
level
- 指示所需日志程度的Level对象实例 - 抛出:
-
SecurityException
- 如果存在SecurityManager及其checkPermission方法拒绝调用setLogger
-
NullPointerException
- 如果logger为null - 参见:
-
getLogger
返回应用程序用于检索由SyncProvider实现发布的同步事件的日志记录对象。
- 返回:
-
已指定用于由SyncProvider实现使用的
Logger
- 抛出:
-
SyncFactoryException
- 如果未设置日志记录对象。
-
setJNDIContext
设置初始JNDI上下文,从中可以从JNDI命名空间检索SyncProvider实现
此方法检查是否存在授予权限
setSyncFactory
的SQLPermission
对象,然后允许方法成功。如果存在SecurityManager
及其checkPermission
方法拒绝调用setJNDIContext
,此方法将抛出java.lang.SecurityException
。- 参数:
-
ctx
- 一个有效的JNDI上下文 - 抛出:
-
SyncFactoryException
- 如果提供的JNDI上下文为null -
SecurityException
- 如果存在SecurityManager及其checkPermission方法拒绝调用setJNDIContext
- 参见:
-