public class SyncFactory extends Object
SyncProvider
实例,由断开的RowSet
对象使用。
SyncProvider
实例又提供javax.sql.RowSetReader
对象RowSet
对象需要填充数据和javax.sql.RowSetWriter
对象,它需要将其数据的更改传播回底层数据源。
因为SyncFactory
类中的方法都是静态的,所以每个Java VM只有一个SyncFactory
对象。 这确保了RowSet
实现可以从其获得SyncProvider
实现的单一来源。
SyncFactory
类提供了可用同步提供程序实现( SyncProvider
对象)的内部注册表。
可以查询此注册表以确定哪些同步提供程序可用。
以下代码行获取当前注册的提供者的枚举。
java.util.Enumeration e = SyncFactory.getRegisteredProviders();
所有标准的RowSet
实现必须至少提供两个提供者:
CachedRowSet
实现或从中派生的实现 WebRowSet
对象 SyncProvider
实现RIOptimisticProvider
和RIXmlProvider
,其满足这个要求。
SyncFactory
类提供访问器方法来协助应用程序确定当前在哪个同步提供程序中注册了SyncFactory
。
其他方法让RowSet
持久性提供者在工厂机制中注册或取消注册。 这允许在运行时向RowSet
对象提供额外的同步提供程序实现。
应用程序可以应用一定程度的过滤来确定SyncProvider
实现提供的SyncProvider
级别。 以下标准确定提供程序是否可用于RowSet
对象:
RowSet
对象指定,并且SyncFactory
不包含对该提供程序的SyncFactoryException
,则会抛出SyncFactoryException
,指出找不到同步提供程序。 RowSet
实现是用指定的提供者实例化的,并且指定的提供者已被正确地注册,则提供所请求的提供者。 否则SyncFactoryException
被抛出。 RowSet
对象未指定SyncProvider
实现,并且没有额外的SyncProvider
实现可用,则提供参考实现提供程序。 SyncProvider
实现 供应商和开发者可以注册SyncProvider
使用以下机制中的一个实施方式。
-Drowset.provider.classname=com.fred.providers.HighAvailabilityProvider
#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
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
,其中包含绑定到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
封装规范。
SyncProvider
, SyncFactoryException
Modifier and Type | Field and Description |
---|---|
static String |
ROWSET_SYNC_PROVIDER
同步提供程序实现名称的标准属性ID。
|
static String |
ROWSET_SYNC_PROVIDER_VERSION
同步提供程序实现版本标记的标准属性ID。
|
static String |
ROWSET_SYNC_VENDOR
同步提供程序实现供应商名称的标准属性ID。
|
Modifier and Type | Method and Description |
---|---|
static SyncProvider |
getInstance(String providerID)
返回
SyncProvider 通过
providerID鉴定实例。
|
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寄存器中删除指定的当前注册的同步提供程序。
|
public static final String ROWSET_SYNC_PROVIDER
public static final String ROWSET_SYNC_VENDOR
public static final String ROWSET_SYNC_PROVIDER_VERSION
public static void registerProvider(String providerID) throws SyncFactoryException
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
- 一个
String
对象,其中注册了同步提供程序的唯一ID
SyncFactoryException
- 如果尝试提供一个空的或空的提供者名称
setJNDIContext(javax.naming.Context)
public static SyncFactory getSyncFactory()
SyncFactory
单身人士。
SyncFactory
例子
public static void unregisterProvider(String providerID) throws SyncFactoryException
providerID
- 同步提供程序的唯一ID
SyncFactoryException
- 如果尝试取消注册尚未注册的SyncProvider实现。
public static SyncProvider getInstance(String providerID) throws SyncFactoryException
SyncProvider
通过
providerID鉴定实例。
providerID
- 提供商的唯一标识符
SyncProvider
实现
SyncFactoryException
- 如果找不到
null
,providerID为
null
,或尝试调用此提供程序时遇到某些错误。
public static Enumeration<SyncProvider> getRegisteredProviders() throws SyncFactoryException
RowSet
实现可以使用枚举中的任何提供者作为其SyncProvider
对象。
至少应允许使用JDBC驱动程序存储RowSet内容数据的引用同步提供程序。
SyncFactoryException
- 如果获得注册的提供者发生错误
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)
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
public static Logger getLogger() throws SyncFactoryException
Logger
已被指定使用
SyncProvider
实现
SyncFactoryException
- 如果没有设置日志对象。
public static void setJNDIContext(Context ctx) throws SyncFactoryException
此方法检查是否有一个SQLPermission
对象在允许该方法成功之前授予权限setSyncFactory
。 如果一个SecurityManager
存在,并且它的checkPermission
方法拒绝调用setJNDIContext
,这个方法会抛出一个java.lang.SecurityException
。
ctx
- 有效的JNDI上下文
SyncFactoryException
- 如果提供的JNDI上下文为空
SecurityException
- 如果存在安全管理员,并且其
checkPermission
方法拒绝调用
setJNDIContext
SecurityManager.checkPermission(java.security.Permission)