服務對象資料(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 是帶有 POJO 接口的智能的“傳統 Java 對象(plain old Java object,POJO)”。
在 SOA 中,應用程式并不直接地連接配接資料源。它通路一個叫做資料通路服務(data access service,DAS)的中介并接收響應中的資料圖。DAS 是為特定資料源種類處理技術細節的服務。它為客戶機将資料轉換成 SDO 圖。客戶機應用程式與資料圖進行互動來獲得資料和改變資料。為了将更新應用于原始的資料源,應用程式将更新過的圖發送回 DAS,而 DAS 又與資料源互動。通常,運作時提供 DAS 的實作,而應用程式開發工具提供對資料圖的支援。
SDO 通過封裝資料通路的細節将業務應用程式與技術改變相隔離,進而避開了技術改變産生的影響——重新編寫應用程式以便跟上改變的技術.例如,考慮一個設計用來從資料庫中讀取産品描述并将其作為網頁顯示的 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 代碼。