- 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.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
- 另请参见:
-
SyncProvider
,SyncFactoryException
- 一个乐观的供应商,用于与
-
-
Field Summary
Fields Modifier and Type Field 描述 static String
ROWSET_SYNC_PROVIDER
同步提供程序实现名称的标准属性ID。static String
ROWSET_SYNC_PROVIDER_VERSION
同步提供程序实现版本标记的标准属性ID。static String
ROWSET_SYNC_VENDOR
同步提供程序实现供应商名称的标准属性ID。
-
方法摘要
所有方法 静态方法 具体的方法 Modifier and Type 方法 描述 static SyncProvider
getInstance(String providerID)
返回由 providerID标识的SyncProvider
实例。static Logger
getLogger()
返回应用程序的记录对象,以检索SyncProvider实现发布的同步事件。static Enumeration<SyncProvider>
getRegisteredProviders()
返回当前注册的同步提供程序的枚举。static SyncFactory
getSyncFactory()
返回SyncFactory
单身人士。static void
registerProvider(String providerID)
将给定的同步提供程序添加到工厂注册表。static void
setJNDIContext(Context ctx)
设置可以从JNDI命名空间中检索SyncProvider实现的初始JNDI上下文static void
setLogger(Logger logger)
设置由所使用的日志对象SyncProvider
由提供的实现SyncFactory
。static void
setLogger(Logger logger, Level level)
设置由SyncFactory
SPI提供的SyncProvider
实现使用的日志记录对象。static void
unregisterProvider(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上下文的同步提供程序。
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)
设置由SyncFactory
SPI提供的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)
-
-