青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 181, 文章 - 2, 評論 - 85, 引用 - 0
數據加載中……

用于實現 Web 服務的 SOA 編程模型,第 2 部分: 使用服務數據對象簡化的數據訪問

利用服務數據對象簡化面向服務的軟件中的數據訪問和表示。SDO 用統一的抽象代替各種各樣的數據訪問模型來創建、檢索、更新和刪除供服務實現使用的業務數據。這是我們有關用于 IBM? 面向服務的體系結構 (SOA) 的編程模型系列文章的第二篇。

服務對象數據

服務對象數據(Service Data Object,SDO)使用統一的抽象代替了各種各樣的數據訪問模型來創建、檢索、更新和刪除供服務實現使用的業務數據。SDO(請參閱參考資料部分中的 Service Data Objects 2.0 和 Next-Generation Data Programming: Service Data Objects)是 IBM 面向服務的體系結構 (SOA) 的基礎概念。SDO 將開發人員從如何訪問特定的后端數據源的技術細節中解放出來,提高了他們的工作效率,這樣他們就可以主要專注于業務邏輯(請參閱參考資料部分中的 Integrating relational data into Web applications、Next-generation data programming in the Java? environment 以及 Using Service Data Objects with Enterprise Information Integration technology)。SDO 是與 BEA Systems, Inc. 聯合制訂的規范,并且在 IBM 系列產品中得到了廣泛的使用,包括 WebSphere? Application Server 和 Rational? Studio 工具。Java? 數據庫連接(Java? DataBase Connectivity),通常稱為 JDBC,是執行結構化查詢語言(Structured Query Langauge,SQL)語句的 Java 接口。目前,用于 JDBC、Web 服務描述語言(Web Services Description Language,WSDL)定義的服務、企業 JavaBean(Enterprise JavaBean,EJB)等等由 Java 編寫的服務實現的編程模型都是相似的,但卻又有一些讓人討厭的不同。

SDO 定義了一種單一的、統一的方法來訪問和操作來自異構數據源的數據,包括關系型數據庫、可擴展標記語言(eXtensible Markup Language,XML)數據源、Web 服務以及企業信息系統 (EIS)。它們是基于數據圖(data graph)的概念。數據圖就是一組可以從數據源中分離出來的樹形結構的對象。SDO 可以在整個應用程序體系結構中使用。

應用程序體系結構的領域 如何使用 SDO
SOA
  • SDO 是服務的輸入和輸出。
數據訪問
  • SDO 訪問關系型、XML、EJB、Java 數據對象(Java Data Object,JDO)和 Hibernate 數據源。
  • SDO 是數據傳輸對象(Data Transfer Object,DTO)——也被稱為值對象(Value Object)。
Web 服務
  • SDO 表示網絡上的 XML。
消息傳遞
  • SDO 表示消息。
XML 使用 SDO 的情況:
  • 支持 XML 的應用程序。
  • 訪問 XML 文件、文檔、資源和消息。
連接器/適配器(EIS,CICS)
  • SDO 表示數據記錄。
EJB
  • SDO 是 DTO(也被稱作值對象)。
  • Java 2 企業版(Java 2 Enterprise Edition,J2EE)設計模式。
ADO.NET
  • ADO DataSet 是 SDO 數據圖的子集。
企業服務總線(Enterprise Service Bus,ESB)
  • SDO 是服務的輸入和輸出。
跨語言編程模型
  • 完整的應用程序可能橫跨層和語言。
  • 用于很多種語言技能集的相同的編程模型。
模型驅動的體系結構(Model-driven architecture,MDA)
  • SDO 模型(類型(Type)和屬性(Property))是通過統一建模語言(Unified Modelling Language,UML)類和組件定義的。
  • SDO 應用程序遵循 UML 順序 (Sequence)、流 (Flow)、狀態 (State) 和協作 (Collaboration)。
Java
  • SDO 是帶有 POJO 接口的智能的“傳統 Java 對象(plain old Java object,POJO)”。

在 SOA 中,應用程序并不直接地連接數據源。它訪問一個叫做數據訪問服務(data access service,DAS)的中介并接收響應中的數據圖。DAS 是為特定數據源種類處理技術細節的服務。它為客戶機將數據轉換成 SDO 圖。客戶機應用程序與數據圖進行交互來獲得數據和改變數據。為了將更新應用于原始的數據源,應用程序將更新過的圖發送回 DAS,而 DAS 又與數據源交互。通常,運行時提供 DAS 的實現,而應用程序開發工具提供對數據圖的支持。

SDO 通過封裝數據訪問的細節將業務應用程序與技術改變相隔離,從而避開了技術改變產生的影響——重新編寫應用程序以便跟上改變的技術(請參閱參考資料部分中的 Wikipedia)。例如,考慮一個設計用來從數據庫中讀取產品描述并將其作為網頁顯示的 Java Web 應用程序。為了訪問數據庫中的產品描述,應用程序很可能使用 JDBC。假設不久后應用程序拓撲發生了改變,在應用程序和數據庫之間放置了 Web 服務。現在,應用程序不能再使用 JDBC 訪問數據,而是需要重做大量的工作來替換 Web 服務應用編程接口 (API),例如文檔對象模型(Document Object Model,DOM)或者基于 XML 的遠程過程調用的 Java API(Java APIs for XML-Based Remote Procedure Call,JAX-RPC)。SDO 避免了這個問題;使用 SDO 編寫的應用程序不必改變。

另外,SDO 提供了支持元數據 API 的應用程序、工具和框架來以統一的方式自省數據模型,而不管它的來源。DAS 將后端元數據轉換成標準的 SDO 格式。

SDO 類型可以由 Java 接口、XML Schema、關系型表和列、EJB、COBOL 記錄、消息或者 UML 來定義(請參閱參考資料部分中的 Catalog of OMG Modeling and Metadata Specifications);實現人員可以選擇自己喜歡的系統類型。簡單 Java 和 XML 數據類型是有效的 SDO 數據類型,這為 Java 實現人員簡化了一步。SDO 支持動態的和靜態的數據訪問模型,兩者也可以一起使用。我們將更詳細地考慮這些內容:

  • 動態模型(缺省值)允許編程人員通過名稱(字符串)獲得和設置數據圖中的數據元素。當 SDO 的類型在編譯階段未知時,或者當程序部署完以后可能要添加新的屬性時,這特別有用。客戶機應用程序或服務查詢 SDO 來了解它的結構,然后按名稱讀取和更新任何元素。例如,可以編寫一個泛型 SDO 訪問函數并用特定于元素的元數據填充它來訪問單獨的 SDO。SDO 同樣也使用 XML 路徑語言( XML Path Language,XPath)表達式的子集來支持快速遍歷許多 DataObject,例如 customer[1]/address/zip,以便快速訪問 customer DataObejct 的 zip 代碼。
  • 靜態模型使用命名和類型化 Java 接口。每個數據元素有自己的“getter”和“setter”方法。工具從 SDO 類型和屬性生成靜態接口。

SDO 對于數據表示非常重要,即使沒有典型的數據源也如此。這種用法的例子包括使用 Web 服務交換的 XML 消息、Java 消息服務 (JMS) 消息、XML 文件等等。







示例

下面的例子——定義了包含客戶數據的數據對象——說明了使用 Java 或 XML 來定義和使用 SDO 是多么的容易。示例 1(使用 XML)是 SDO 類型的基礎。


示例 1. 使用 XML 的 SDO 類型定義
												
																		
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
                xmlns:tns="http://www.myvalue.com"
		targetNamespace="http://www.myvalue.com">
	<element name="customer" type="Customer"/>
	<complexType name="Customer">
		<sequence>
			<element name="customerID" type="string"/>
			<element name="firstName" type="string"/>
			<element name="lastName" type="string"/>
			<element name="stockSymbol" type="string"/>
			<element name="stockQuantity" type="int"/>
		</sequence>
	</complexType>
</schema>

												
										

示例 2 中,由前面的 XML 所生成的 Java 接口說明了如何使用靜態接口。


示例 2. 使用 Java 的 SDO 類型定義
												
																		
public interface Customer {
	String getCustomerID();
	void setCustomerID(String customerID);
	String getFirstName();
	void setFirstName(String firstName);
	String getLastName();
	void setLastName(String lastName);	
        String getStockSymbol();
	void setStockSymbol(String stockSymbol);
	int getStockQuantity();
	void setStockQuantity(int stockQuantity);
}

												
										

一旦 SDO 類型定義好,就可以通過將類型定義傳遞給 SDO 數據工廠 (data factory) 來將其實例化(為數據對象分配存儲空間)。這個工廠僅僅是運行時的一個組件,它的功能就是根據 SDO 類型定義實例化 SDO 數據對象。

示例 3 示例 4 分別展示了如何通過傳遞 XML Schema 名稱空間和復雜的類型名稱(在示例 1 中定義的)或者 Java 接口類(在示例 2 中定義的)作為參數來創建 SDO。


示例 3. 使用 XML Schema 名稱空間和復雜的類型名稱參數創建 SDO
												
																		
DataObject customer = DataFactory.INSTANCE.create("http://www.myvalue.com", "Customer");

												
										



示例 4. 使用具有 Java 接口類參數的 SDO DataFactory 創建 SDO
												
																		
Customer customer = (Customer) DataFactory.INSTANCE.create(Customer.class);

												
										

在 SDO 實例化之后,實現就可以訪問它了。示例 5示例 6 中的代碼示例分別展示了對 Customer SDO 的動態和靜態訪問。


示例 5. 動態訪問 SDO
												
																		
DataObject customer = ... ;
customer.setString("customerID", customerID);
...
customer.setInt("stockQuantity", 100);
String customerID = customer.getString("customerID");
...
int stockQuantity = customer.getInt("stockQuantity");

												
										



示例 6. 靜態訪問 SDO
												
																		
Customer customer = ... ;
customer.setCustomerID(customerID);
...
customer.setStockQuantity(100);
String customerID = customer.getCustomerID();
...
int stockQuantity = customer.getStockQuantity();

												
										

我們使用訪問 XML 文件服務和關系數據庫的例子來進一步說明由 SDO 推動的編程模型的簡單性。請注意,盡管技術之間存在差異,但是這些應用程序是如此的相似。應用程序開發人員能夠專注于業務邏輯,而讓服務去處理更新持久數據存儲的實現細節。

示例 7. XML 文件服務

這個簡單的例子將數據從 XML 文件加載到 SDO 數據圖,打印并更新數據,然后將它寫回文件。(業務目標是將“quot;Adam”改為“Kevin”。)

根據根 XML 元素和一個多值的 customer 屬性定義將要作為根 customers 數據對象讀入的 XML 文件。在 XML 文件中 Customers 為每個 customer 元素包含一個數據對象。每個 customer 具有兩個屬性:SNfirstName
																				
																						<customers xmlns="http://customers.com">
	<customer SN="1" firstName="Adam" />
	<customer SN="2" firstName="Baker" />
</customers>

																				
																		

讀取文件數據。
																				
																						DataObject root = xmlService.load(InputStream);

																				
																		

遍歷 customer 數據對象列表并打印出每個名 (first name)。
																				
																						Iterator i = root.getList("customer").iterator();
while (i.hasNext()) {
	DataObject cust = (DataObject) i.next();
	String name = cust.getString("firstName");
	System.out.println(name);
}

																				
																		

將第一個客戶數據對象的 firstName 屬性設為 Kevin。中間件更新變更摘要(這里并沒有顯示出來)來指示改變了的數據。
																				
																						DataObject customer1 = root.getDataObject("customer[1]");
customer1.setString("firstName", "Kevin");  // or

root.setString("customer[1]/firstName", "Kevin");


																				
																		

將數據對象寫入文件。
																				
																						xmlService.save(OutputStream, root);

																				
																		

結果是更新的 XML 文檔。
																				
																						<customers xmlns="http://customers.com">
  <customer SN="1" firstName="Kevin" />
  <customer SN="2" firstName="Baker" />
</customers>

																				
																		

示例 8. 訪問關系數據庫

雖然復雜的關系數據庫到 SDO 的映射是可行的,但是這個例子使用的是一個非常簡單的映射:每個數據庫表都是一個 SDO 類型,表的每行是 SDO 數據對象,而每列是 SDO 屬性。應用程序邏輯是相同的:通過執行預先定義好的查詢從數據庫中讀取、打印并更新數據(將“Adam”改為“Kevin”),將更改保存到數據庫。數據庫查詢返回 CUSTOMER 表中的兩行:

CUSTOMER ID(整數,主鍵) CUSTOMER FIRSTNAME(字符串) CUSTOMER LASTNAME(字符串)
1 Adam Smith
2 Baker Street

下面給出了帶有解釋的 SDO 實現。

rdbService 查詢數據庫以獲得數據。
																				
																						DataObject root = rdbService.get(); 

																				
																		

相同的數據可能已經用 XML 等價地表示了。
																				
																						<customers>
  <CUSTOMER ID="1" FIRSTNAME="Adam" LASTNAME="Smith"/>
  <CUSTOMER ID="2" FIRSTNAME="Baker" LASTNAME="Street"/>
</customers>

																				
																		

打印每個客戶名。
																				
																						Iterator i = root.getList("CUSTOMER").iterator();
while (i.hasNext()) {
	DataObject cust = (DataObject) i.next();
	String name = cust.getString("FIRSTNAME");
	System.out.println(name);
}

																				
																		

將第一個數據對象的 FIRSTNAME 設為 Kevin。中間件更新變更摘要(這里并沒有顯示出來)來指示改變。
																				
																						DataObject customer1 = root.getDataObject("CUSTOMER[1]");
customer1.setString("FIRSTNAME", "Kevin"); // or

root.setString("CUSTOMER[1]/FIRSTNAME", "Kevin"); 

																				
																		

將更新的數據寫入數據庫。
																				
																						rdbService.update(root);

																				
																		

現在數據庫包含:

CUSTOMER ID(整數,主鍵) CUSTOMER FIRSTNAME(字符串) CUSTOMER LASTNAME(字符串)
1 Kevin Smith
2 Baker Street

注意,第一行已經被更新了。

如果在我們的示例應用程序已經獲得數據圖之后,另外一個應用程序訪問數據庫并更改了值會怎么樣?在寫入時,數據訪問服務檢查變更摘要來決定如何對數據源應用更新。數據庫可以使用開放式并發控制 (optimistic concurrency control) 來確保這個改變之前最后包含的值是“Adam”(否則,另外一個應用程序可能先改變數據,可能在該應用程序中需要某些錯誤恢復)。某些服務實現了更為高級的開放式并發形式;變更歷史記錄提供了那些算法所需要的原始值。

使用 EJB 時,SDO 作為 DTO(也稱作值對象)J2EE 設計模式。一般來說,訪問實體 EJB(Entity EJB)的每個屬性的開銷非常大,所以傳輸幾個數據圖中的 SDO 對象效率更高。會話 EJB(Session EJB)可能有方法產生和使用 SDO 圖來更加高效地直接訪問實體 EJB。Customer 實體 EJB 封裝了對 Customer 記錄的數據庫訪問。會話 EJB 提供了訪問方法來從 Customer 實體 EJB 產生和返回 Customer SDO 圖。


示例 9. 返回 SDO 和由 SDO 更新實體 EJB 的會話 Bean 接口
												
																		
public interface CustomerSession {
	Customer getCustomerByID(String customerID);
	Customers getCustomersByLastName(String lastName);
	void updateCustomers(Customers customers);
}

												
										

Customers 是包含若干客戶的 SDO 根數據對象。CustomersList 包含 Customer 數據對象。ChangeSummary 用來記錄對 Customer 對象所做的全部更改,包括任何的添加、刪除或更新。updateCustomers() 方法利用所做的更改來更新 Customer 實體 EJB,并且可以在一個事務中批處理對數據源的更改。


示例 10. 使用 Java 的 Customer 的 SDO 類型定義
												
																		
public interface Customers {
	List<Customer> getCustomers();
	ChangeSummary getChanges();
}

												
										







總結

SDO 為所有數據源啟用了對應用程序數據的統一訪問和公共編程模型,而不管數據存儲在何地以及如何存儲。SDO 利用了 XML 的簡易性,而又沒有引入 XML Schema 的復雜性或序列化的性能問題。通過同時使用 SDO 和 SOA,可以將系統編程任務從業務邏輯中分離出來,并且將其封裝在可重用的服務之中,而不是所有編程人員都必須掌握這些技能才能入門。它們在沒有陷入技術和實現細節的情況下簡化了業務應用程序的編程,防止了技術改變產生的影響。有了 SDO,業務應用程序就是名副其實的業務應用程序。

posted on 2006-04-17 03:38 wsdfsdf 閱讀(238) 評論(0)  編輯 收藏 引用 所屬分類: 技術文章

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美www视频| 亚洲国产精品久久91精品| 亚洲午夜电影在线观看| 亚洲国产一区二区在线| 久久全球大尺度高清视频| 欧美一级在线视频| 久久国产福利| 久久日韩粉嫩一区二区三区| 久久久久久九九九九| 久久亚洲精品一区| 欧美成人综合网站| 最新成人av网站| 一区二区欧美亚洲| 午夜在线成人av| 久久躁狠狠躁夜夜爽| 欧美精品日韩一本| 国产精品一区二区在线观看不卡| 国产欧美日韩在线| 亚洲国产精品电影| 亚洲在线观看| 久久久久久久久岛国免费| 欧美sm视频| 亚洲婷婷综合久久一本伊一区| 亚洲综合色自拍一区| 老鸭窝亚洲一区二区三区| 欧美日韩中文在线| 亚洲福利视频一区| 欧美一区二区视频网站| 亚洲国产精品高清久久久| 亚洲欧美清纯在线制服| 欧美大片免费| 国产一区二区三区直播精品电影| 日韩午夜电影av| 久久久久久欧美| 亚洲免费观看高清完整版在线观看熊 | 老司机精品久久| 亚洲精品日韩综合观看成人91 | 欧美精品久久久久久久久老牛影院| 欧美性猛交xxxx乱大交蜜桃| 国产视频一区在线| 一区二区三区成人精品| 久色婷婷小香蕉久久| 伊人成人在线视频| 国产精品a久久久久久| 激情综合亚洲| 午夜欧美大尺度福利影院在线看 | 欧美日韩在线不卡一区| 伊人婷婷久久| 欧美一区国产一区| 一区二区欧美激情| 欧美人与性动交α欧美精品济南到| 国产在线精品一区二区中文| 亚洲自拍高清| 亚洲狼人综合| 欧美激情自拍| 日韩视频精品| 亚洲黄色尤物视频| 另类成人小视频在线| 国产一区二区在线观看免费播放 | 羞羞答答国产精品www一本| 亚洲另类自拍| 欧美精品色综合| 亚洲精品一区二区三| 欧美国产一区在线| 免费欧美视频| 亚洲精选国产| 最新精品在线| 欧美片在线观看| 在线视频日韩| 在线性视频日韩欧美| 欧美午夜理伦三级在线观看| 亚洲欧美久久久| 午夜精品久久久久久99热| 国产亚洲综合精品| 麻豆成人精品| 欧美成人精品h版在线观看| 亚洲精品自在在线观看| 亚洲欧洲一区| 欧美日韩综合另类| 欧美在线免费一级片| 欧美在线一二三四区| 曰韩精品一区二区| 亚洲国产精品va在线看黑人| 欧美日韩黄视频| 小嫩嫩精品导航| 久久久久久久久蜜桃| 91久久夜色精品国产九色| 亚洲精品一二区| 国产精品一区亚洲| 欧美不卡在线视频| 欧美三级电影一区| 老色鬼精品视频在线观看播放| 欧美.www| 欧美在线视频一区二区| 美女日韩欧美| 午夜在线观看免费一区| 久久综合图片| 亚洲欧美日韩视频二区| 久久久精品国产免大香伊| 欧美国产日韩一区二区| 欧美精选在线| 亚洲欧美国产三级| 久久国产精品99国产精| 亚洲日本在线观看| 欧美一区二区三区视频在线 | 91久久在线| 国产日韩欧美亚洲| 亚洲人成在线观看一区二区| 国产欧美日韩综合精品二区| 亚洲国产精品一区制服丝袜 | 亚洲第一区在线观看| 夜夜精品视频一区二区| 亚洲国产三级在线| 欧美在线关看| 午夜精品久久久久久久99黑人| 久久夜色精品国产欧美乱| 欧美亚洲综合久久| 欧美日韩国产高清| 欧美1区视频| 国产在线视频欧美一区二区三区| 一本色道久久88亚洲综合88| 亚洲免费观看| 麻豆精品视频在线| 久久免费国产| 国产一区二区福利| 亚洲一区二区三区高清不卡| 一本色道久久| 欧美激情第六页| 欧美国产欧美亚洲国产日韩mv天天看完整 | 老司机凹凸av亚洲导航| 久久国产精品99国产| 国产精品久久国产愉拍| 亚洲日本理论电影| 亚洲美女91| 欧美成人黄色小视频| 亚洲高清av在线| 亚洲区一区二区三区| 可以看av的网站久久看| 免费日韩视频| 亚洲三级色网| 欧美日韩国产成人在线| 99亚洲一区二区| 亚洲综合激情| 国产精品日韩欧美一区| 中文久久精品| 久久高清福利视频| 在线不卡a资源高清| 久久亚洲综合网| 久久久免费av| 国产曰批免费观看久久久| 午夜精品久久久久久| 久久久精品日韩欧美| 伊大人香蕉综合8在线视| 久久天天躁夜夜躁狠狠躁2022 | 亚洲三级电影全部在线观看高清| 美日韩免费视频| 亚洲国产成人精品久久久国产成人一区| 在线观看日韩av电影| 欧美成人精品h版在线观看| 亚洲欧洲一区二区在线观看| 一区二区三区国产精品| 国产精品久久网| 欧美一级大片在线观看| 猛干欧美女孩| 日韩一级精品视频在线观看| 欧美性事在线| 久久精品系列| 亚洲乱码精品一二三四区日韩在线| 亚洲一区二区高清| 韩国在线一区| 欧美日韩国产美女| 欧美在线国产| 亚洲日本成人| 久久人人爽爽爽人久久久| 日韩一区二区精品| 国产精品丝袜91| 麻豆精品一区二区av白丝在线| 亚洲精品国产系列| 久久精品99久久香蕉国产色戒| 亚洲黄色在线看| 国产精品一区二区黑丝| 欧美成人a视频| 午夜天堂精品久久久久| 亚洲精美视频| 狂野欧美激情性xxxx| 亚洲男人的天堂在线| 亚洲国产精品va在看黑人| 国产精品一区2区| 欧美精品尤物在线| 久久精品日韩| 亚洲午夜久久久久久久久电影网| 欧美a级一区| 欧美影院在线| 亚洲视频一区二区在线观看| 在线日本欧美| 韩国av一区二区三区| 国产精品羞羞答答xxdd| 欧美三级午夜理伦三级中视频| 久久伊伊香蕉| 久久精品国产999大香线蕉|