- 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实现或CachedRowSet派生的实现 - 一个XML提供程序,用于读取和写入XML,如
WebRowSet对象
SyncProvider实现RIOptimisticProvider和RIXmlProvider。SyncFactory类提供访问器方法来协助应用程序确定当前在哪个同步提供程序中注册了SyncFactory。其他方法让
RowSet持久性提供者注册或者RowSet工厂机制。 这允许在运行时向RowSet对象提供额外的同步提供程序实现。应用程序可以应用一定程度的过滤来确定
SyncProvider实现提供的同步级别。 以下标准确定提供程序是否可用于RowSet对象:- 如果特定提供程序由
RowSet对象指定,并且SyncFactory不包含对此提供程序的引用,SyncFactoryException抛出一个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.0SyncFactory检查此文件并注册其包含的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
- 另请参见:
-
SyncProvider,SyncFactoryException
- 一个乐观的供应商,用于与
-
-
Field Summary
Fields Modifier and Type Field 描述 static StringROWSET_SYNC_PROVIDER同步提供程序实现名称的标准属性ID。static StringROWSET_SYNC_PROVIDER_VERSION同步提供程序实现版本标记的标准属性ID。static StringROWSET_SYNC_VENDOR同步提供程序实现供应商名称的标准属性ID。
-
方法摘要
所有方法 静态方法 具体的方法 Modifier and Type 方法 描述 static SyncProvidergetInstance(String providerID)返回由 providerID标识的SyncProvider实例。static LoggergetLogger()返回应用程序的记录对象,以检索SyncProvider实现发布的同步事件。static Enumeration<SyncProvider>getRegisteredProviders()返回当前注册的同步提供程序的枚举。static SyncFactorygetSyncFactory()返回SyncFactory单身人士。static voidregisterProvider(String providerID)将给定的同步提供程序添加到工厂注册表。static voidsetJNDIContext(Context ctx)设置可以从JNDI命名空间中检索SyncProvider实现的初始JNDI上下文static voidsetLogger(Logger logger)设置由所使用的日志对象SyncProvider由提供的实现SyncFactory。static voidsetLogger(Logger logger, Level level)设置由SyncFactorySPI提供的SyncProvider实现使用的日志记录对象。static voidunregisterProvider(String providerID)从工厂SPI寄存器中删除指定的当前注册的同步提供程序。
-
-
-
字段详细信息
-
ROWSET_SYNC_PROVIDER
public static final String ROWSET_SYNC_PROVIDER
同步提供程序实现名称的标准属性ID。- 另请参见:
- Constant Field Values
-
ROWSET_SYNC_VENDOR
public static final String ROWSET_SYNC_VENDOR
同步提供程序实现供应商名称的标准属性ID。- 另请参见:
- Constant Field Values
-
ROWSET_SYNC_PROVIDER_VERSION
public static final String ROWSET_SYNC_PROVIDER_VERSION
同步提供程序实现版本标记的标准属性ID。- 另请参见:
- Constant Field Values
-
-
方法详细信息
-
registerProvider
public static void registerProvider(String providerID) throws SyncFactoryException
将给定的同步提供程序添加到工厂注册表。SyncProvider规范中针对SyncProvider实现所需的命名约定提供了SyncProvider。可以通过将SyncProvider实例绑定到JNDI命名空间来注册绑定到JNDI上下文的同步提供程序。
此外,初始JNDI上下文应与被设定SyncProvider p = new MySyncProvider(); InitialContext ic = new InitialContext(); ic.bind ("jdbc/rowset/MySyncProvider", p);SyncFactory使用setJNDIContext方法。SyncFactory利用此上下文来搜索绑定到JNDI上下文及其子节点的可用SyncProvider对象。- 参数
-
providerID- 一个String对象,其中注册了同步提供程序的唯一ID - 异常
-
SyncFactoryException- 如果尝试提供一个空的或空的提供者名称 - 另请参见:
-
setJNDIContext(javax.naming.Context)
-
getSyncFactory
public static SyncFactory getSyncFactory()
返回SyncFactory单身人士。- 结果
-
SyncFactory实例
-
unregisterProvider
public static void unregisterProvider(String providerID) throws SyncFactoryException
从工厂SPI寄存器中删除指定的当前注册的同步提供程序。- 参数
-
providerID- 同步提供程序的唯一标识 - 异常
-
SyncFactoryException- 如果尝试取消注册尚未注册的SyncProvider实现。
-
getInstance
public static SyncProvider getInstance(String providerID) throws SyncFactoryException
返回由 providerID标识的SyncProvider实例。- 参数
-
providerID- 提供商的唯一标识符 - 结果
-
一个
SyncProvider实现 - 异常
-
SyncFactoryException- 如果找不到SyncProvider,则providerID为null,或者尝试调用此提供程序时遇到某些错误。
-
getRegisteredProviders
public static Enumeration<SyncProvider> getRegisteredProviders() throws SyncFactoryException
返回当前注册的同步提供程序的枚举。 ARowSet实现可以使用枚举中的任何提供程序作为其SyncProvider对象。至少应允许使用JDBC驱动程序存储RowSet内容数据的引用同步提供程序。
- 结果
- 枚举枚举在本厂注册的可用同步提供程序
- 异常
-
SyncFactoryException- 如果获得注册的提供者发生错误
-
setLogger
public static void setLogger(Logger logger)
设置由所使用的日志对象SyncProvider由提供的实现SyncFactory。 所有SyncProvider实现都可以将其事件记录到此对象,并且应用程序可以使用getLogger方法检索此对象的getLogger。此方法检查是否有一个
SQLPermission对象,在允许该方法成功之前授予setSyncFactory权限。 如果一个SecurityManager存在,并且其checkPermission方法拒绝调用setLogger,则此方法将抛出一个java.lang.SecurityException。- 参数
-
logger- 记录器对象实例 - 异常
-
SecurityException- 如果存在安全管理员,并且其checkPermission方法拒绝调用setLogger -
NullPointerException- 如果记录器为空 - 另请参见:
-
SecurityManager.checkPermission(java.security.Permission)
-
setLogger
public static void setLogger(Logger logger, Level level)
设置由SyncFactorySPI提供的SyncProvider实现使用的日志记录对象。 所有SyncProvider实现都可以将其事件记录到此对象,并且应用程序可以使用getLogger方法检索此对象的getLogger。该方法检查是否有一个
SQLPermission对象,允许该方法成功,授予setSyncFactory权限。 如果一个SecurityManager存在,并且其checkPermission方法拒绝调用setLogger,此方法将抛出一个java.lang.SecurityException。- 参数
-
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命名空间中检索SyncProvider实现的初始JNDI上下文此方法检查是否有允许该方法成功的
SQLPermission对象授予setSyncFactory权限。 如果一个SecurityManager存在,其checkPermission方法拒绝调用setJNDIContext,此方法将抛出一个java.lang.SecurityException。- 参数
-
ctx- 有效的JNDI上下文 - 异常
-
SyncFactoryException- 如果提供的JNDI上下文为空 -
SecurityException- 如果存在安全管理员,并且其checkPermission方法拒绝调用setJNDIContext - 另请参见:
-
SecurityManager.checkPermission(java.security.Permission)
-
-