|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個軟體套件 下一個軟體套件 | 框架 無框架 |
請參見:
描述
介面摘要 | |
---|---|
SyncResolver | 定義一個框架,當發生同步衝突時,它允許應用程序使用手工決策階層樹來確定應該執行的操作。 |
TransactionalWriter | 一個專用介面,用來方便地擴展標準 SyncProvider 抽象類別以便擁有細粒度的事務控制。 |
XmlReader | 一個專用介面,用來方便地擴展 SyncProvider 抽象類別以用於導向 XML 的同步提供者。 |
XmlWriter | 一個專用介面,用來方便地擴展 SyncProvider 抽象類別以用於導向 XML 的同步提供者。 |
類別摘要 | |
---|---|
SyncFactory | 該服務提供者介面 (SPI) 機制可以產生由非連接 RowSet 物件使用的 SyncProvider 實例。 |
SyncProvider | 為非連接 RowSet 物件提供 reader/writer 功能的同步機制。 |
異常摘要 | |
---|---|
SyncFactoryException | 指示 SyncFactory 機制發生的錯誤。 |
SyncProviderException | 指示 SyncProvider 機制發生的錯誤。 |
第三方供應商在其同步提供者的實作中必須使用的標準類別和介面。這些類別和介面被稱為服務提供者介面 (SPI)。供應商通過向 jdbc@sun.com
發送電子郵件,可以使其實作被 JDBC 網頁所包含,該網頁列出了可用的 SyncProvider
實作。這樣做有助於開發人員瞭解該實作。為了使 RowSet
物件能夠使用實作,供應商必須向 SyncFactory
單件註冊。(有關註冊過程和所使用命名約定的完整解釋,請參閱 SyncProvider
的類別註釋。)
以下類別和介面組成了 javax.sql.rowset.spi
套件:
SyncFactory
SyncProvider
SyncFactoryException
SyncProviderException
SyncResolver
XmlReader
XmlWriter
TransactionalWriter
javax.sql
套件中的以下介面也是 SPI 的一部分:
RowSetReader
RowSetWriter
SyncProvider
實作通過以下機制提供非連接 RowSet
物件:將資料讀入該物件和將在該物件中修改的資料寫回底層資料源。當調用 CachedRowSet
方法 execute
或 populate
時,reader、RowSetReader
或 XMLReader
物件可以將資料讀入 RowSet
物件。當調用 CachedRowSet
方法 acceptChanges
時,writer、RowSetWriter
或 XMLWriter
物件可以將更改寫回底層資料源。
將 RowSet
物件中的更改寫入其資料源的過程稱為同步。RowSet
正在使用的 SyncProvider
實作可以確定 RowSet
物件的 writer 所使用的同步級別。同步的各種級別被稱為等級。
同步的較低等級稱為樂觀 共時級別,因為它們樂觀地假設不存在任何衝突或僅有極少的衝突。當在 RowSet
物件中修改的同一資料也在資料源中修改時,會發生衝突。使用樂觀共時模型意味著如果存在衝突,則會丟失對資料源或 RowSet
物件的修改。
同步的較高等級被稱為悲觀,因為它們假設資料源會被存取並修改。這些等級可以設置各種級別的鎖定以增加不發生衝突的幾率。
最低層級別的同步只將對 RowSet
物件進行的任何更改寫入到其底層資料源。writer 不執行任何檢查衝突的操作。如果存在衝突,並且資料源值被覆寫,則其他方對資料源進行的更改會丟失。
RIXMLProvider
實作使用最低層級別的同步,並僅將 RowSet
更改寫入資料源。確實是這樣,因為 XML 資料源通常不會啟用事務處理技術來維護資料完整性。但是,特定的標準化組織已經在考慮提供基於 XML 的同步。有關詳細資訊,請參閱
http://www.syncml.org
對於下一個級別,writer 會查看是否存在衝突,如果存在,則它不將任何內容寫入到資料源。此共時級別的問題是如果另一方在 RowSet
物件獲得其資料後修改了資料源中相應資料,則對 RowSet
物件進行的修改會丟失。RIOptimisticProvider
實作使用此級別的同步。
對於稱為悲觀共時的較高層級別的同步,writer 會採取一些步驟(如設置鎖定)來避免衝突。設置鎖定可以是在一個行上設置,也可以是在一個表或整個資料源上設置。因此,同步級別是一個以下兩者間的權衡:使用者共時存取資料源的能力和 writer 保持 RowSet
物件及其同步資料源中資料的能力。
它要求所有非連接 RowSet
物件(CachedRowSet
、FilteredRowSet
、JoinRowSet
和 WebRowSet
物件)從 SyncFactory
機制獲取它們的 SyncProvider
物件。
參考實作 (RI) 提供兩個同步提供者。
SyncFactory
實例將它提供給非連接 RowSet
物件。RowSet
物件和資料源同步之前是否存在衝突。如果存在衝突,它不執行任何操作,這意味著對 RowSet
物件的更改不會保留到資料源。
WebRowSet
物件一起使用的同步提供者,它是一個以 XML 格式寫入或以 XML 格式進行讀取的 rowset。RIXMLProvider
實作根本不檢查任何衝突,僅將 WebRowSet
物件中的任何更新資料寫入底層資料源。WebRowSet
物件處理 XML 資料時使用此提供者。
SyncProvider
實作與參考實作捆綁在一起,使它們總是可用於 RowSet
實作。SyncProvider
實作通過向單一 SyncFactory
註冊使它們本身可用。當 RowSet
物件通過在建構子中指定某個提供者,或者指定它作為 CachedRowSet
方法 setSyncProvider
的參數來請求該提供者時,該單一 SyncFactory
會查看請求的提供者是否已向它註冊。如果已註冊,則 SyncFactory
創建一個它的實例,並將它傳遞到發出請求的 RowSet
物件。如果指定的 SyncProvider
實作沒有註冊,則單一 SyncFactory
導致拋出 SyncFactoryException
物件。如果不指定任何提供者,則單一 SyncFactory
將創建一個預設的提供者實作 RIOptimisticProvider
的實例,並將它傳遞到發出請求的 RowSet
物件。
如果 WebRowSet
物件在其建構子中未指定提供者,則 SyncFactory
將為它提供一個 RIOptimisticProvider
實例。但是,可以實作 WebRowSet
的建構子來將提供者設置為 RIXMLProvider
,它以 XML 格式讀取和寫入 RowSet
物件。
有關更多詳細資訊,請參閱 SyncProvider 類別規範。
供應商可以使用任何一個可能級別的同步開發 SyncProvider 實作,從而給 RowSet
物件一個選擇同步機制的機會。供應商通過向 jdbc@sun.com
的 Sun Microsystems 註冊完全限定類別名稱使其實作可用。下面將更加詳細地討論此過程。
服務提供者介面提供了一個可插入的機制,通過該機制可以註冊
2.2 向
第三方
關於如何指定系統屬性或屬性檔案中的屬性以及如何配置 JNDI 上下文的細節,已在
2.3 SyncFactory 提供者實例產生策略
如果正確地註冊了提供者,則
在
完全可插入到
此外,
3.2 等級
JSR 114 定義了一組等級,用來描述
3.3 鎖定
JSR 114 定義一個常數集,它指定是否對
這些常數應被視為對等級常數的補充。當
3.4 可更新的視圖
使用 SQL
3.5
在下面的範例中,參考 CachedRowSetImpl 實作通過調用 setSyncProvider 方法重新配置其當前 SyncProvider 物件。
在調用
然後,應用程序可以使用
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。2.0 服務提供者介面架構
2.1 概觀
SyncProvider
實作,然後在需要時可產生該實作。SyncFactory
使用的延時參考機制 (lazy reference mechanism) 在非連接 RowSet
物件需要實例之前不會創建實例,從而限制了不必要的資源消耗。SyncFactory
類別也提供了標準 API 來配置日誌選項和特定的 SyncProvider
實作可以提供的串流。
SyncFactory
註冊
SyncProvider
實作必須向 SyncFactory
註冊,以便非連接 RowSet
物件獲取它,從而使用其 javax.sql.RowSetReader
和 javax.sql.RowSetWriter
實作。以下註冊機制可用於所有 SyncProvider
實作:
SyncProvider
物件中。
SyncFactory
提供此上下文,以便機制能正確運行。
SyncFactory
類別描述中進行了詳細說明。
SyncFactory
會產生所請求的 SyncProvider
物件。當使用指定的 SyncProvider
實作實例化非連接 RowSet
物件,或者使用替代 SyncProvider
物件在運行時對它進行配置時,請遵循以下策略。
SyncProvider
物件,並且 SyncFactory
不 套件含對提供者的任何參考,則拋出一個 SyncFactoryException
。
SyncProvider
物件,並且 SyncFactory
套件含對提供者的參考,則提供所請求的提供者。
SyncProvider
物件,則提供參考實作提供者 RIOptimisticProvider
。
類別中更詳細地闡述了這些策略。
SyncFactory
3.0 SyncProvider 實作者指南
3.1 要求
SyncFactory
的相容 SyncProvider
實作必須擴展和實作 SyncProvider
類別中所有的抽象方法。另外,實作必須確定 SyncProvider
類別定義中定義的等級、鎖定和可更新視圖的功能。必須支持一個或多個 SyncProvider
描述標準。供應商實作需要提供一系列的等級、鎖定和可更新視圖的功能。
SyncProvider
命名約定必須符合 SyncProvider
類別描述中的詳細資訊。
SyncProvider
物件可以提供非連接 RowSet
物件的同步質量。按服務質量從低到高的順序列出了這些等級。
SyncProvider
實作僅嘗試將在 RowSet
物件中更改的任何資料寫入底層資料源,覆寫存在的任何內容。不嘗試比較原始值與當前值來查看是否存在衝突。使用此等級實作 RIXMLProvider
。
SyncProvider
實作將檢查在上一次同步和當前正進行的同步之間進行更改的行中的衝突。任何原始資料源中已被修改的更改不會反映在非連接 RowSet
物件中。如果不存在任何衝突,則將 RowSet
物件中的更改寫入資料源。如果存在衝突,則不寫入任何更改。RIOptimisticProvider
實作使用此等級。
SyncProvider
實作將檢查所有的行,包括在非連接 RowSet
物件中沒有更改的行。因此,當同步成功完成時,對底層資料源中的行進行的任何更改將反映在非連接 RowSet
物件中。
SyncProvider
實作將鎖定原始資料源中的行(該行與 RowSet
物件中更改的行對應),以減少其他進程修改資料源中同一資料的可能性。
SyncProvider
實作將鎖定用於填充 RowSet
物件的原始查詢所影響的整個視圖和/或表。
RowSet
物件的底層資料源進行了某些鎖定,如果是,它還指定進行鎖定的建構。當 RowSet
物件從資料源斷開時,這些鎖定將保留在資料源上。
RowSet
物件從其資料源斷開時,多數等級設置的預設設置要求不保留任何資料源鎖定。等級 GRADE_LOCK_WHEN_MODIFIED
和 GRADE_LOCK_WHEN_LOADED
允許非連接 RowSet
物件對鎖定程度進行細粒度控制。
RowSet
物件沒有其他指示,則這是所有 SyncProvider
實作的預設鎖定設置。
RowSet
物件的原始 SQL 查詢會涉及這些行。
RowSet
物件的查詢會涉及這些表。
RowSet
物件使用的整個資料源進行鎖定。
VIEW
中的資料可以填充 RowSet
物件。以下常數指示 SyncProvider
物件是否可以更新從中衍生出 VIEW
的表中的資料。
SyncProvider
實作支持對從中衍生出用於填充 RowSet
物件的 SQL VIEW
的表的同步。
SyncProvider
實作不支持對從中衍生出用於填充 RowSet
物件的 SQL VIEW
的表的同步。
SyncProvider
等級和鎖定的用法
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.setSyncProvider("com.foo.bar.HASyncProvider");
應用程序通過非連接 RowSet
物件可以檢索當前正在使用的 SyncProvider 物件。它也可以檢索實作提供者的同步等級和當前正在使用的鎖定程度。另外,應用程序可以靈活地設置要使用的鎖定程度,從而增加成功同步的可能性。以下程式碼片段展示了這些操作。
SyncProvider sync = crs.getSyncProvider();
switch (sync.getProviderGrade()) {
case: SyncProvider.GRADE_CHECK_ALL_AT_COMMIT
//A high grade of optimistic synchronization
break;
case: SyncProvider.GRADE_CHECK_MODIFIED_AT_COMMIT
//A low grade of optimistic synchronization
break;
case: SyncProvider.GRADE_LOCK_WHEN_LOADED
// A pessimistic synchronization grade
break;
case: SyncProvider.GRADE_LOCK_WHEN_MODIFIED
// A pessimistic synchronization grade
break;
case: SyncProvider.GRADE_NONE
// No synchronization with the originating data source provided
break;
}
switch (sync.getDataSourcLock() {
case: SyncProvider.DATASOURCE_DB_LOCK
// A lock is placed on the entire datasource that is used by the
//
使用 RowSet
object
break;
case: SyncProvider.DATASOURCE_NO_LOCK
// No locks remain on the originating data source.
break;
case: SyncProvider.DATASOURCE_ROW_LOCK
// A lock is placed on the rows that are touched by the original
// SQL statement used to populate
// the RowSet object that is using the SyncProvider
break;
case: DATASOURCE_TABLE_LOCK
// A lock is placed on all tables that are touched by the original
// SQL statement used to populated
// the RowSet object that is using the SyncProvider
break;
SyncFactory
類別中的靜態實用工具方法也能夠確定當前向 SyncFactory
註冊的 SyncProvider
實作所組成的列表。
Enumeration e = SyncFactory.getRegisteredProviders();
4.0 解決同步衝突
介面 SyncResolver
提供了一種應用程序手動確定發生衝突時應執行的操作的方式。當 CachedRowSet
方法 acceptChanges
完成並檢測到一個或多個衝突時,它將拋出一個 SyncProviderException
物件。應用程序可以捕獲該異常,並通過調用方法 SyncProviderException.getSyncResolver()
使它檢索 SyncResolver
物件。
SyncResolver
物件是實作了 SyncResolver
介面的一種特殊 CachedRowSet
物件或 JdbcRowSet
物件,它逐行檢查衝突。它與同步的 RowSet
物件完全相同,區別在於它僅包含資料源中導致衝突的資料。將所有其他列值都設置為 null
。為了從一個衝突值導航到另一個衝突值,SyncResolver
物件提供了方法 nextConflict
和 previousConflict
。
SyncResolver
介面也提供了一些方法,用於執行以下操作:
RowSet
物件中的值(如果它需要更改)
CachedRowSet
方法 acceptChanges
時,它會委託給 RowSet
物件的 SyncProvider
物件。實作的 SyncProvider
物件提供 writer 的方式決定對衝突執行檢查的級別(等級)。完成所有的衝突檢查並且找到一個或多個衝突之後,方法 acceptChanges
會拋出一個 SyncProviderException
物件。應用程序可以捕獲該異常,並使用該異常獲取 SyncResolver
物件。
SyncResolver
方法獲取關於每個衝突的資訊,並決定要執行的操作。如果應用程序邏輯或使用者決定 RowSet
物件中的值應該保留,那麼應用程序或使用者可以使用它覆寫資料源值。
SyncResolver
介面的註釋有更多詳細資訊。
5.0 相關的規範
6.0 相關的文檔
概觀
軟體套件
類別
使用
階層樹
已過時
索引
說明
JavaTM 2 Platform
Standard Ed. 6
上一個軟體套件
下一個軟體套件
框架
無框架
提交錯誤或意見