程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用pureQuery優化現有的JDBC應用程序

使用pureQuery優化現有的JDBC應用程序

編輯:關於JAVA

開始之前

pureQuery 簡介

IBM Data Studio 產品組合中包括 pureQuery,它是一個高性能數據訪問平台 ,旨在簡化 Java 數據訪問的開發、管理、安全保障和優化。它由開發工具(在 Data Studio Developer 中)、一個簡單直觀的 API 和一個運行時(在 Data Studio purequery Runtime 中)組成。

在優化 DB2 數據的 Java 數據訪問和保障訪問的安全方面,pureQuery 的主 要優點是開發和部署使用靜態 SQL 的應用程序非常容易。當使用靜態 SQL 時, 執行 SQL 語句的准備步驟是在應用程序執行之前就進行的,因此可在運行時取得 更好的性能。此外,靜態 SQL 總是可以預先知道,因此不會受到惡意的或意外的 SQL 注入的影響,而這正是動態 SQL 的安全缺陷。

以前,為了使用靜態 SQL,需要用 pureQuery 帶注釋的方法樣式來編寫應用 程序。在 1.2 版的 Data Studio Developer 和 Data Studio pureQuery Runtime 中,無論現有的 JDBC 應用程序是直接實現持久性,還是使用流行的框 架(比如 Hibernate 和 JPA 來實現持久性),都可以使用靜態 SQL,而不必重 新編寫代碼。這個特性有時候被稱作客戶機優化(client optimization),因為 啟用靜態 SQL 的過程是在 JDBC 客戶機這一級發生的。我們將此特性稱作 pureQuery for JDBC applications。

啟用應用程序的 pureQuery for JDBC applications 特性的常規過程是一個 迭代的過程,由以下幾個階段組成:

計劃。計劃階段的目的是確定應用程序是否適合使用 pureQuery。雖然從概念 上講可以為任何訪問任意 DB2 數據服務器中的數據的 Java 應用程序啟用該特性 ,但是應用程序必須滿足一定的標准,例如先決條件(比如,應用程序在 JRE 1.5 或以上中運行)、安全方面(比如,DBA 或數據管理員同意使用基於數據庫 包的安全性,而不是基於表/視圖的安全性)等等。

捕捉。PureQuery for JDBC applications 靜態地處理 SQL 語句時,依賴於 關於應用程序 SQL 語句及其相關元數據的信息。捕捉階段收集必要的信息,並將 其存儲在一個元數據文件中。

配置。為了靜態地執行 SQL,首先必須將它綁定到一個數據庫包。在此之前, 可以配置已捕捉的 SQL 文件,以指定一些設置,例如每個包中存放多少條 SQL 語句。

綁定。定義包的特征之後,需要將捕捉的 SQL 和相關的元數據綁定到一個或 多個數據庫(也可以將它存儲到 DBRM 中,以後再部署它)。

執行和驗證。成功地完成上述階段後,pureQuery for JDBC applications 就 配置好了,這就可以靜態地執行 SQL 語句了。在驗證過程中,質量保證專家驗證 應用程序是否按預期執行,並返回預期的結果。

注意:在通常的使用場景中,啟用(enablement)過程是一個迭代的過程。

關於本教程

在本教程中,學習如何使用 Data Studio Developer,讓一個簡單的定制開發 的 JDBC 應用程序可以使用 pureQuery for JDBC applications 特性。不過,您 也可以使用自己選擇的訪問任意平台上的 DB2 數據的應用程序來學習本教程。客 戶機優化不需要訪問源代碼,但是本教程中的步驟假設您有那樣的訪問權。

目標

本教程的目標是介紹使現有的 JDBC 應用程序支持 pureQuery 的步驟。為了 使本教程簡單一些,我們提供了一個小型的應用程序,這個應用程序直接使用 JDBC 實現持久性,它滿足啟用 pureQuery 所需的所有要求,並且很容易驗證。

在本教程中,您將學習如何:

創建一個示例數據庫,並將示例 JDBC 應用程序導入到 Data Studio Developer 1.2 中。

使用一個代碼路徑運行應用程序,並捕捉它的 SQL。

在 Java 源代碼中查看示例應用程序的 SQL 和它與 Java 源代碼的關系(可 選)。

配置捕捉到的 SQL,並將其綁定到一個數據庫包。

以靜態 SQL 執行模式運行示例應用程序,並驗證它是否具有正確的行為。

使用另一條代碼路徑運行應用程序,以捕捉剩下的 SQL;然後,使用靜態 SQL 執行重新綁定並重新運行應用程序。

先決條件

本教程是為擁有基於 Eclipse 的工具方面的基本經驗的應用程序開發人員和 DBA 編寫的。

系統需求

為了運行本教程中的例子,需要安裝 Data Studio Developer 1.2。另外還需 要對 DB2 數據服務器的訪問權。

創建示例數據庫,並導入示例 JDBC 應用程序

創建示例數據庫

示例應用程序將從一組數據庫表中檢索數據。請遵循下面的步驟,在一個名為 GS_DB 的數據庫中創建並填充這些表。

確保 DB2 Express-C 9(或任何其他受支持的 DB2 數據服務器)已經安裝, 並且正在運行。

打開一個 DB2 Command Window。從開始菜單中選擇 Programs > IBM DB2 > DB2COPY1 > Command Line Tools > Command Window。

將附帶的數據庫設置腳本 DB_Script.sql 復制到一個目錄中。

確保 Command Window 正指向保存 DB_Script.sql 的路徑;如果沒有,則更 改到該路徑。

輸入以下命令運行數據庫設置腳本:db2 -tf DB_Script.sql

將示例應用程序導入到 Data Studio Developer

將附帶的 zip 文件 ClientOptimizationProject.zip 復制到一個目錄。

啟動 Data Studio Developer 1.2。

看到提示時,輸入任意工作區名稱。

切換到 Java 透視圖(圖 1 顯示了如何找到這個透視圖)。

圖 1. 查找當前活動的透視圖

為了切換透視圖,選擇 Window > Open Perspective > Java。

圖 2. 切換到 Java 透視圖

選擇 Window > Show View > Other... > Data,打開 Database Explorer 和 pureQuery Outline 視圖。

圖 3. 將 Database Explorer 和 pureQuery Outline 視圖添加到當前透視圖 中

選擇 File > New > Project... > Java > Java Project,然後 單擊 Next,創建一個新的 Java 項目,如圖 4 所示。

圖 4. 創建新的 Java 目錄

將項目命名為 ClientOptimization,並對它進行配置,如圖 5 所示。在 Contents 下,選擇 Create new project in workspace,對於 JRE,選擇 Use default JRE (Currently 'jdk')。在 Project layout 下,選擇 Create separate source and output folders,並單擊 Finish 保存配置更改。

圖 5. 配置 Java 項目

選擇前面下載到本地計算機的 zip 文件。選擇文件夾 .classpath 和 .project 來完成向導。在 “Into folder” 域中,選擇 ClientOptimization, 然後勾選 Overwrite existing resources without warning。最後單擊 Finish ,以便將例子源代碼導入到當前項目中。圖 7 顯示了這些步驟。

圖 7. 導入示例項目

在 Package Explorer 中,展開 ClientOptimization 項目。如圖 8 所示, source 文件夾包含一個名為 BasicJDBCApp 的 com.ibm.co.test 包中的 Java 類。這個示例應用程序有兩個執行路徑(runCodePath1() 和 runCodePath2()) ,它們將根據可選的 4 個命令行參數有條件地執行:

參數 1(必需):標識示例數據庫的 JDBC URL

參數 2(必需):應用程序用於連接到示例數據庫的 DB2 用戶 ID

參數 3(必需):以上用戶 ID 的密碼

參數 4(可選):標識要執行的代碼路徑;1 表示代碼路徑 1,2 表示代碼路 徑 2,沒有值則表示同時執行這兩個路徑

圖 8. Package Explorer 中顯示的導入的 Java 項目

為示例數據庫注冊新的連接

對於本教程中的一些任務,需要到 GS_DB 示例數據庫的一個連接。注意,示 例應用程序本身使用一個單獨的數據庫連接,這個連接獨立於在准備步驟中建立 的連接。

在 Database Explorer 視圖上,右鍵單擊 Connections 並選擇 New Connection...

圖 9. 在 Data Studio Developer 中創建新的數據庫連接

完成數據庫連接向導,創建到 GS_DB 數據庫的一個新連接,如圖 10 所示:

輸入 GS_DB 作為連接名稱和數據庫名稱。

對於主機名,如果 DB2 在本地計算機上運行,則輸入 localhost,否則輸入 適當的主機名。

對於端口號,如果在安裝期間將 DB2 配置為使用默認的端口號,則輸入 50000,否則輸入適當的端口號。

輸入有效的 DB2 用戶憑證,並單擊 Test Connection 驗證 Data Studio Developer 是否能訪問例子數據庫。

單擊 Finish。

圖 10. 創建新的數據庫連接

恭喜,您已經完成了設置過程。現在可以進入下一步 — 為項目啟用 pureQuery 並捕捉應用程序的 SQL。

捕捉應用程序的 SQL

要利用 pureQuery for JDBC applications,必須首先在應用程序運行時捕捉 應用程序的 SQL 語句。如圖 11 所示,捕捉過程還獲取相關聯的元數據,例如輸 入和輸出參數特征。對於後面創建支這些 SQL 語句的靜態執行的數據庫包的步驟 ,這裡捕捉的信息是必需的。在本教程的後面,您還將看到這些捕捉到的信息如 何使工具中獨特的功能查看 Java-SQL 關系。

圖 11. PureQuery 捕捉模式概覽

只要應用程序環境被配置為使用適當級別的包含擴展的 pureQuery 功能的 DB2 或 Informix Dynamic Server(IDS)驅動程序,就可以從任何 Java 應用程 序捕捉 SQL。

Data Studio Developer 附帶了一組適當的數據服務器驅動程序,完成本教程 需要用到這些驅動程序。要訪問這些驅動程序,首先必須將 pureQuery 支持添加 到 ClientOptimization 項目中。

將 pureQuery 支持添加到示例項目中

默認情況下,Java 項目不支持 pureQuery 特性。請遵從以下步驟啟用那些特 性,並將 DB2 Java Common Client(JCC)驅動程序和 pureQuery Runtime 庫復 制到示例項目中。

在 Package Explorer 中,右鍵單擊 ClientOptimization 項目,選擇 pureQuery > Add pureQuery Support...

圖 12. 添加 pureQuery 支持

為了將示例數據庫與當前項目相關聯,選擇用於 GS_DB 的數據庫連接,並單 擊 Next,如圖 13 所示。

圖 13. 將項目與一個數據庫連接相關聯

如圖 14 所示,勾選 Enable SQL capturing and binding for JDBC applications 選項,並單擊 Finish。

圖 14. 啟用 SQL 捕捉和綁定

按 F5 刷新 Package Explorer 視圖。您將注意到,下面的文件已經被添加到 ClientOptimization 項目中(如圖 15 所示):

DB2JccConfiguration.properties:這個屬性文件用於配置 JCC 驅動程序的 運行時行為。

pdq.jar 和 pdqmgmt.jar:這些庫提供 pureQuery 運行時和工具功能。

db2jcc.jar 和 db2jcc_license_cisuz.jar:這些是 pureQuery 運行時所必 需的專用 JCC 驅動程序庫。

pureQueryFolderDefault.genProps:這個屬性文件用於配置將在綁定階段創 建的數據庫包的特征。

pureQueryFolderDefault.bindProps:這個屬性文件用於配置數據庫包綁定選 項。

這些庫被自動添加到 classpath,所以只要在 Data Studio Developer 中啟 動本教程中的應用程序,該應用程序就可以使用這些庫。(後面會更詳細地討論 這些屬性文件的作用)。

圖 15. 這些文件表明項目已啟用 pureQuery

注意:如果要為不在 Data Studio Developer 中運行的應用程序啟用 pureQuery for JDBC applications,則需要將必需的 DB2 和 pureQuery 庫安裝 到本地文件系統中,並將它們添加到 classpath 環境變量。

啟用 SQL 語句捕捉功能

如果按以下方式之一指定 pdqProperties 屬性,則專用 JCC 驅動程序庫以 pureQuery 模式運行:

在 DB2JccConfiguration.properties 文件中

作為運行 JDBC 應用程序的 JVM 的一個參數

作為一個應用服務器,例如 WebSphere Application Server 的一個數據源屬 性

作為數據庫連接 URL 的一部分

通過使用 java.util.Properties 類作為連接對象的屬性

在本教程中,您將使用 DB2JccConfiguration.properties 配置文件,該文件 是在將 pureQuery 支持添加到 ClientOptimization 項目時創建的。

在 Package Explorer 中,雙擊打開 DB2JccConfiguration.properties 文件 。通過覆蓋默認的屬性值,可以配置驅動程序的 pureQuery 運行時行為。默認的 屬性文件定義 3 個 pureQuery 屬性:

captureMode。如果該屬性被設置為 ON,則驅動程序捕捉成功執行的 SQL。要 禁用捕捉,可將屬性值設為 OFF。

executionMode。該屬性定義驅動程序如何執行 SQL 語句:動態(DYNAMIC) 還是靜態(STATIC)。如果沒有指定,默認值為 DYNAMIC。

pureQueryXml。當 captureMode 屬性被設置為 ON 時,驅動程序從一個文件 中讀取前面捕捉的 SQL 語句和相關的元數據,並附加在這個 XML 文件的後面。 該屬性值表明一個 XML 文件的名稱和它在文件系統中的位置,驅動程序使用這個 XML 文件作為讀寫操作的目標。在捕捉模式中,如果這個文件不存在,則在指定 位置創建它,如果存在,則更新它。

要獲得受支持運行時選項的完整列表及其簡要描述,可以利用內容輔助特性: 將鼠標定位到行尾,輸入一個逗號,並按下 <CTRL> <SPACE> 鍵。 圖 16 顯示了這個步驟。

圖 16. 使用內容輔助修改驅動程序屬性

放棄之前可能對配置文件做過的更改。配置文件已經定義了捕捉示例應用程序 的 SQL 語句所需的屬性。

注意:若要為不在 Data Studio Developer 中運行的 JDBC 應用程序啟用 pureQuery 捕捉模式,可以使用前面提到的幾個方法之一。例如,要為在一個操 作系統 shell 中運行的應用程序啟用捕捉模式,可以以系統屬性的形式指定適當 的 pureQuery 屬性:

java -Ddb2.jcc.pdqProperties=captureMode(ON),executionMode (DYNAMIC),... package.ClassName

運行示例應用程序以捕捉它的 SQL 語句

利用內建的 Eclipse 特性,可以在 Data Studio Developer 中運行示例應用 程序。如果要這樣做,可以按下面的步驟創建一個 “run” 配置:

在 Package Explorer 視圖中,展開 ClientOptimization 項目。

展開 src 文件夾,找到 BasicJDBCApp.java 源文件,並右鍵單擊它。

從上下文菜單中,選擇 Run As>Run...

右鍵單擊 Java Application,在 Run 向導中選擇 New。

圖 17. 為示例應用程序創建新的運行配置

如圖 18 所示,輸入 BasicJDBCApp 作為配置名,ClientOptimization 作為 封裝對象,com.ibm.co.test.BasicJDBCApp 作為要執行的類。

圖 18. 指定運行配置選項

選擇 Arguments 選項卡,指定以下程序參數:

參數 1:標識示例數據庫的 JDBC URL

參數 2:應用程序用於連接到示例數據庫的 DB2 用戶 ID

參數 3:以上用戶 ID 的密碼

參數 4:標識要執行的代碼路徑;為了只執行第一條代碼路徑,指定 1

圖 19 顯示了一個運行配置的例子。

圖 19. 運行配置的示例

在捕捉 SQL 語句時,驅動程序分析語句,如果檢測到可能導致語句靜態執行 時產生不正確結果的潛在問題,則發出警告消息。默認情況下,這些警告消息不 會顯示,因為應用程序可以在任何環境中運行,生成的輸出可能不可見。

建議:啟用 pureQuery 日志記錄被認為是最佳實踐,它可以在一個外部文件 中捕捉和查看警告,以確定在執行接下來的步驟之前是否需要做其他事情。

要啟用日志記錄,可將系統屬性 pdq.traceLevel 設置為 FINE,還可以將一 個文件名指定給系統屬性 pdq.traceFile。例如,為了啟用捕捉示例應用程序的 SQL 時的日志記錄,可輸入 -Dpdq.traceLevel=FINE 作為 VM 參數,如 圖 19 所示。如果沒有指定日志文件的名稱,在默認使用 pdq.log 作為文件名。

單擊 Run 啟動應用程序,並捕捉應用程序在執行第一條代碼路徑時發出的 SQL 語句。(在現實場景中,會對應用程序運行一組測試套件,以確保盡可能多 的 SQL 語句被運行,從而被捕捉)。

可選:浏覽捕捉的元數據

在此順便簡要地展示一下,在捕捉到一些 SQL 之後,可以做些什麼很棒的事 情。Data Studio Developer 1.2 提供了一個名為 pureQuery Outline 的新視圖 ,通過這個視圖,應用程序開發人員和 DBA 可以確定檢索或操作哪些數據庫對象 ,以及該操作是在源代碼中的什麼地方執行的。有了這樣的信息,就可以大大提 高生產率,因為這簡化了分析和問題診斷。

要利用 pureQuery outline 視圖提供的可視化功能,Java 應用程序必須使用 方法樣式的 pureQuery API 作為數據訪問層,或者允許使用您已經完成的步驟捕 捉它的 SQL。

在 Package Explorer 中,選擇 ClientOptimization 項目,並按 F5 鍵刷新 顯示屏。捕捉過程結束後,現在項目中多了兩個文件:捕捉的 SQL 元數據文件 pureQueryFoldercapture.pdqxml 和 pureQuery 日志文件 pdq.log。

圖 20. 捕捉 SQL 時創建的文件

打開 pdq.log。如果在捕捉過程中檢測到,某個已執行的 SQL 語句靜態地執 行時可能導致不正確的結果,那麼可以看到相應的警告消息。注意,日志文件中 沒有包含任何警告消息,這表明沒有檢測到潛在的問題。關閉日志文件。

雙擊 pureQueryFoldercapture.pdqxml,以使用 pureQuery Outline 視圖顯 示捕捉到的元數據。

定位到 pureQuery Outline 視圖。如果該視圖中沒有顯示信息,則單擊 refresh outline 圖標,如圖 21 所示。

圖 21. “refresh” 圖標

該視圖被分成三個選項卡:Database、Java 和 SQL。本教程的這一部分只討 論前兩個選項卡;SQL 選項卡放在下一節的配置階段時討論。

選擇 Database 選項卡。如圖 22 所示,該選項卡顯示 Java 應用程序以捕捉 模式執行時訪問或修改過的數據庫對象的列表。該信息以層次結構的形式顯示, 標識數據庫對象、創建對象時所在的模式、對對象執行的查詢,以及相應的應用 程序棧跟蹤。對於每條 SQL 語句,顯示一組列,表明哪些數據被訪問。

圖 22. Database 選項卡

樹中顯示的每個節點和元素都提供可簡化常見開發或維護活動的功能,將 SQL 更緊密地集成到 Java IDE 中。

雙擊一個模式、表或列節點,以打開 Database Explorer 視圖,並查看相應 的屬性。(也可以右鍵單擊表名並選擇 Show in Database Explorer)。

圖 23. 在 Database Explorer 中查看表的屬性

雙擊一條 SQL 語句,以打開源代碼(如果它在當前項目中)。光標將定位到 執行該 SQL 語句的那一行,或者,對於批量更新,光標將定位到使用 JDBC 方法 addBatch 添加該 SQL 語句的那一行。(也可以右鍵單擊語句並選擇 Show in Source)。

圖 24. 查看 SQL 語句在源代碼中的位置

右鍵單擊一條 SQL 語句,執行常見的開發或管理任務,例如執行 SQL 語句( 不必編譯和運行應用程序)、將 SQL 語句保存到一個文件中(例如,為了創建一 個工作負載)或者啟動 Visual Explain 以查看當前訪問計劃。

圖 25. 從 pureQuery outline 中調用 SQL 相關任務

無論是應用程序開發人員還是 DBA,都可以通過使用這個元數據透視圖快速地 發現哪些數據庫對象受到應用程序的影響,它們是如何被訪問或操縱的,以及該 操作在應用程序中的什麼地方執行。

Java 選項卡顯示相同的信息,但是按 Java 包和類來對信息進行分組,以便 於確定哪些數據庫對象被源代碼的一個特定層訪問或修改。

選擇 Java 選項卡。

圖 26. 識別被執行的 SQL 語句

右鍵單擊一個類名,並選擇 Show in SQL Editor...,以保存所有顯示的用於 這個類的 SQL 語句。可以使用這個功能來構建一個小型的工作負載,用於模擬用 例或使相關人員(比如 DBA)可以得到應用程序 SQL。

雙擊一條 SQL 語句,打開源代碼(如果它在當前項目中)。光標將被定位到 執行 SQL 語句的那一行上。(也可以右鍵單擊語句並選擇 Show in Source)。

雙擊一個模式、表或列節點,打開 Database Explorer 視圖,並查看相應的 屬性。(也可以右鍵單擊一個表名並選擇 Show in Database Explorer) 。

右鍵單擊一條 SQL 語句,執行常見的開發或管理任務。

選擇多條 SQL 語句,並單擊右鍵,將選中的語句導出到一個文件中。

查看顯示的 SQL 語句。注意,即使語句在源代碼中只出現一次,這裡卻會顯 示重復的語句。這裡顯示的源代碼信息表示棧跟蹤元素。因此,對於棧跟蹤裡的 每個元素,都會列出一條 SQL 語句。例如,在當前應用程序中,第 78 行的 runCodePath1() 方法檢索一組產品。而在第 237 行,main(String[] args) 方 法調用了這個方法。(Database 選項卡提供了更直觀的棧跟蹤元素視圖)。

注意:捕捉過程只捕捉惟一的 SQL 語句。如果 SQL 語句的 SQL 文本和相關 元數據(例如輸入和輸出參數以及它們的特征)相同,則認為是同一條 SQL 語句 。例如,假設一個應用程序在源代碼中的兩個不同位置從一個 CUSTOMER 表中選 擇一個客戶 ID:

source code line 305: con.execute("SELECT C_ID FROM CUSTOMER ORDER BY C_ID");
            ...
source code line 428: con.execute("SELECT C_ID FROM CUSTOMER ORDER BY C_ID");

pureQuery Outline 視圖只顯示這條 SQL 語句在源代碼中的一個地方 — 啟 用捕捉時第一次成功執行該語句的那個地方。這一行為並不影響在該 SQL 語句所 有出現的地方靜態地執行它。

配置和綁定捕捉的 SQL

配置捕捉的元數據

捕捉的 SQL 語句和它們的相關元數據與數據庫包還沒有任何關聯。因此,必 須定義這些 SQL 語句如何映射到數據庫包,如何命名包,以及是否將包版本化。 Data Studio Developer 提供了用於定義那些包的特征的工具。

在 pureQuery Outline 視圖中,選擇 SQL 選項卡,並展開 DB2 Packages 節 點。這個選項卡中顯示的信息使您可以預覽要創建的用於容納捕捉前面的 SQL 語 句的包。

圖 27. 使用 pureQuery Outline 視圖預覽數據庫包

第一個子節點表示一個數據庫包。默認情況下,通常的包名(Client)是由封 裝項目的名稱(ClientOptimization)的前 6 個字符得出的。GS_DB 數據庫中可 能已經存在具有這個名稱的包,也可能沒有。為了確定是否已經存在使用那個名 稱的包,雙擊 Client(或右鍵單擊包名並選擇 Show in Database Explorer)。 如果已經定義了具有那個名稱的數據庫包,則 Database Explorer 視圖中會顯示 它,否則顯示一個錯誤。

展開 Client 節點,它表示一個在 GS_DB 數據庫中不存在的數據庫包(如果 您第一次實踐本教程)。這時會顯示一組被捕捉到的 SQL 語句,如果執行綁定操 作,這些 SQL 語句將被存儲到這個包中。

向下鑽取任意一條 SQL 語句。這時會顯示 Java 應用程序棧跟蹤和被該語句 訪問或修改的一組數據庫對象。探索可通過雙擊或右鍵單擊 SQL 語句、棧跟蹤元 素或數據庫對象執行的各種不同的任務。

圖 28. 在數據庫包預覽選項卡中浏覽與 SQL 語句相關的元數據

要定制數據庫包的特征,必須覆蓋配置文件 Default.genProps 中的默認設置 。這個配置文件是在為 ClientOptimization 項目啟用 pureQuery 時創建的。

在 Package Explorer 中,展開 ClientOptimization 項目,展開 pureQueryFolder 文件夾,雙擊 Default.genProps,然後在編輯器中打開該文件 。

如果在 pureQuery for JDBC applications 的上下文中,則使用這個文件來 定義一個捕捉文件的以下特征:

在創建另一個包之前,將該文件中最大數量的 SQL 語句(默認為 100;這只 是軟限制)分配給一個數據庫包

包名的前綴,必要時用它生成一個或多個包名

將在其中創建包的數據庫集合 ID(默認為 NULLID)

一個版本號

配置文件編輯器提供了內容輔助功能,可以用它來添加配置選項或者獲取關於 可用配置選項的幫助。要調用內容輔助,可將光標定位到行尾(必要時添加一個 空格,以便將這個新選項與已有的選項隔開),並按 <CTRL> <SPACE> 鍵,如圖 29 所示。

圖 29. 使用內容輔助覆蓋包配置的默認設置

將自動生成的數據庫包的名稱由 Client 改為 REPP。

按 <CTRL> <S> 保存更改。這時會出現一條警告,表明配置屬性 已經被更改,需要重新構建項目。

單擊 Yes 重新構建項目。

在 Package Explorer 中找到 capture.pdqxml 文件,並雙擊它,以便在 pureQuery Outline 視圖中顯示該文件。

單擊刷新按鈕刷新 pureQuery Outline 視圖。

切換到 SQL 選項卡,預覽更新後的數據庫包特征。包名應該已經從 Client 改為 REPP。

圖 30. 預覽更新後的包特征

單擊包 REPP,並選擇 Properties 視圖,以確認為這個包指定了正確的集合 ID(NULLID)和版本號(no version)。

關閉數據庫包配置文件 Default.genProps。

至此,您已經定義了基本的包特征,現在可以配置綁定選項了。綁定選項定義 static binder 實用程序的行為以及綁定數據庫包時使用的選項。與用於配置包 特征的 Default.genProps 文件類似,可以通過修改一個名為 Default.bindProps 的配置文件來覆蓋默認的綁定選項。這個配置文件是在為項 目啟用 pureQuery 時創建的。

在 Package Explorer 中,展開 ClientOptimization 項目,接著展開 pureQueryFolder 文件夾並雙擊 Default.bindProps,然後在編輯器中打開該文 件。

將光標定位到最後一行,並輸入 defaultOptions=。

調用內容輔助(<CTRL> <SPACE>),預覽可用於 static binder 實用程序的選項。

圖 31. 使用內容輔助覆蓋 static binder 配置的默認設置

注意,嵌入式上下文幫助還提供了一組數據庫包綁定選項(在 -bindOptions 選項之後指定)以及關於它們適用於哪種目標數據庫平台的信息。

圖 32. 使用內容輔助覆蓋綁定選項

由於在本教程中使用默認的綁定選項,因此要放棄可能做出的任何更改,並關 閉 Default.bindProps。

將捕捉的 SQL 綁定到一個數據庫包

綁定實用程序分析捕捉的 SQL 語句,並根據前一階段指定的配置選項創建必 要的數據庫包(或 DBRM 文件)。Data Studio Developer 工具可以簡化綁定包 的任務:只需選取已捕捉和配置的元數據文件,並選擇一個目標數據庫。

在 Package Explorer 中,在文件夾 pureQueryFolder 中選擇捕捉的元數據 文件 capture.pdqxml。

右鍵單擊 capture.pdqxml 並選擇 pureQuery > Bind...。

圖 33. 綁定應用程序

這時打開綁定向導,它會提示選擇在其中創建包的目標數據庫。默認情況下, 選擇與當前項目關聯的數據庫。在開發或測試環境中,如果您的應用程序連接到 的一個或多個開發和測試數據庫,您可以在其中創建包。

選擇 GS_DB 連接並單擊 Finish。完成時,Console 視圖中顯示以下消息:

圖 34. 表明綁定操作成功完成的確認消息

驗證這個包是否在目標數據庫中。在 pureQuery Outline 視圖中,選擇 SQL tab 並雙擊名為 REPP 的 DB2 包,在 Database Explorer 中找到那個包。由於 使用了默認的綁定選項,這個包在 4 個隔離級別(uncommitted read、cursor stability、read stability 和 repeatable read)上綁定。

圖 35. 使用 pureQuery Outline 視圖在 Database Explorer 中找到數據庫 包

確認這個 數據庫包包含捕捉到的 SQL 語句。單擊 REPP1 包,切換到 Properties 視圖。 選擇 Statements 選項卡,將其中列出的語句與 pureQuery Outline 視圖的 SQL 選項卡中顯示的那些語句進行比較。

圖 36. 使用 Properties 視圖驗證數據庫包的內容

在綁定操作中,必要的 EXECUTE 包權限已授給您在綁定向導中選擇的與數據 庫連接關聯的用戶 ID。如果示例應用程序使用相同的用戶 ID 建立數據庫連接, 那麼可以直接以靜態 SQL 執行模式重新運行示例應用程序;否則,先要將必要的 包權限授給適當的用戶 ID。

以靜態 SQL 執行模式運行 JDBC 應用程序

以靜態 SQL 執行模式重新運行示例應用程序

如果沒有對環境作任何更改就重新運行應用程序,那麼它的 SQL 語句仍然會 動態地執行,因為驅動程序當前被配置為動態地處理 SQL 語句。我們在討論在 JCC 驅動程序中啟用 SQL 捕捉的話題時,介紹了 pdqProperties 屬性,該屬性 用於定義 SQL 執行模式。如果 executionMode 屬性被設置為 STATIC,則驅動程 序將已捕捉和配置的元數據裝載到內存中,如果可以找到傳入的 SQL 語句的相關 元數據,就會處理這些 SQL 語句。

圖 37. pdqProperties 指定驅動程序的運行時行為

將驅動程序配置為靜態執行 SQL 語句,並重新運行應用程序代碼路徑 1。

在 Package Explorer 中,雙擊 DB2JccConfiguration.properties,在一個 編輯器中打開它。

將 captureMode 屬性的值從 ON 改為 OFF,以禁用捕捉。

將 executionMode 屬性的值從 DYNAMIC 改為 STATIC。

圖 38. 將 SQL 執行模式從動態改為靜態

保存更改(<CTRL> <S>),但是不要關閉編輯器窗口。

在 Package Explorer 中,展開 src 文件夾,找到 BasicJDBCApp.java 源文 件,並右鍵單擊它。

從上下文菜單中,選擇 Run As>Java Application,以便使用前面創建的 運行配置重新運行示例應用程序的代碼路徑 1。

應用程序應該成功地靜態執行 SQL 語句,並返回與前面一樣的結果。

修改應用程序的運行配置,使之執行代碼路徑 1 和 2,這將導致更多的 SQL 被處理。

右鍵單擊 BasicJDBCApp.java 並選擇 Run As > Run...,將應用程序的運 行配置修改為執行代碼路徑 1 和 2。

選擇 Arguments tab,刪除最後一個程序參數(1)。

圖 39. 修改運行配置執行兩個代碼路徑

單擊 Run。

應用程序應該會順利執行,不會出現警告或錯誤。注意,應用程序已經成功地 處理了之前由於當驅動程序處於捕捉模式時從未運行代碼路徑 2 而未被捕捉的 SQL 語句。

驅動程序如何處理 SQL 語句:PureQuery for JDBC applications 允許應用 程序開發人員或 DBA 在部署時才決定以動態模式(例如在開發時)、混合模式( 在測試時)還是靜態模式(在生產時)運行應用程序的 SQL:

如果 executionMode 屬性被設置為 DYNAMIC,則無論之前是否已被捕捉,所 有 SQL 語句都將動態地執行。

如果 executionMode 屬性被設置為 STATIC,前面被捕捉、配置和綁定的 SQL 將靜態地執行。但是,如果 allowDynamicSQL 屬性被設置為 TRUE(默認設置) ,那麼其他 SQL 語句將以 DYNAMIC 模式執行。如果該屬性被設置為 FALSE,那 麼這些語句將得不到處理,並拋出一個 SQLException。

修改驅動程序的 SQL 執行模式,並重新運行示例應用程序的代碼路徑 1 和 2 ,以便當一條 SQL 語句因缺少元數據信息而不能靜態地執行時,拋出一個異常。

打開驅動程序配置文件 DB2JccConfiguration.properties。

利用內容輔助(<CTRL> <SPACE>),添加屬性 allowDynamicSQL 並賦以值 FALSE,如 圖 39 所示。

圖 40. 防止 SQL 動態執行

保存這個配置文件(<CTRL> <S>),但不要關閉編輯器。一會兒 您還要修改它。

在 Package Explorer 中找到 BasicJDBCApp.java,右鍵單擊它,並從上下文 菜單中選擇 Run As>Java Application,重新運行示例應用程序。

應用程序應該終止,並收到一個錯誤,表明一個 SQL 異常(見圖 41)被拋出 。

圖 41. 由於缺少元數據,SQL 不能靜態地執行

捕捉剩下的 SQL

增量式地捕捉 SQL

在驅動程序配置為僅以靜態模式執行 SQL 語句時,有些 SQL 語句沒有被捕捉 ,要解決處理這些 SQL 語句的問題,必須再完成一次為 JDBC 應用程序啟用 pureQuery 的迭代過程:

通過運行前面沒有運行過的用例,增量式地捕捉缺少的 SQL 語句。

配置新捕捉到的元數據。

重新綁定數據庫包,增加新的 SQL 語句。

重新運行應用程序,驗證它在靜態執行模式下是否有正確的行為。

為了解決防止示例應用程序靜態地執行所有 SQL 語句的問題,必須遵循以下 步驟:

捕捉執行代碼路徑 2 時發出的 SQL 語句。

在驅動程序配置文件 DB2JccConfiguration.properties 中修改 executionMode 和 captureMode 屬性,以便捕捉並動態地執行 SQL 語句,如圖 42 所示。

圖 42. 允許捕捉 SQL

注意,還可以使用一個稍微不同的驅動程序配置,該配置將導致以下運行時行 為,但產生的結果是一樣的:

如果前面已捕捉、配置和綁定 SQL,它則靜態執行

如果前面沒有捕捉、配置和綁定 SQL,它則動態執行

如果 SQL 動態執行,則捕捉它

db2.jcc.pdqProperties=captureMode(ON),
           executionMode(STATIC),allowDynamicSQL (TRUE),
           pureQueryXml(pureQueryFolder/capture.pdqxml)

(以上例子中使用了換行,這僅僅是為布局考慮)。

在運行配置中使用以下程序參數之一(用有效的數據庫名、用戶 ID 和密碼替 換參數值),重新運行示例應用程序,並執行代碼路徑 2(或執行全部 2 條代碼 路徑),捕捉缺少的 SQL 語句。

jdbc:db2://localhost:50000/GS_DB db2admin mypwd 2

jdbc:db2://localhost:50000/GS_DB db2admin mypwd

配置和重新綁定更新後的元數據。

在 Package Explorer 中,選擇 ClientOptimization 項目,單擊右鍵並選擇 Refresh。

選擇更新後的元數據文件 pureQueryFoldercapture.pdqxml,打開 pureQueryOutline 視圖,單擊 outline refresh 按鈕,以便重新裝載視圖,並 使用配置文件 Default.genProps 中的當前設置重新配置捕捉的元數據。

圖 43. 使用 pureQuery Outline 視圖查看新捕捉的 SQL

查看數據庫包預覽(SQL)選項卡的內容。應該有一條或多條 SQL 語句被添加 到包中。

選擇 pureQueryFoldercapture.pdqxml 並單擊右鍵,選擇 pureQuery > Bind... 重新綁定包。

以靜態 SQL 執行模式重新運行示例應用程序。

再次修改 DB2JccConfiguration.properties,關閉捕捉模式,打開靜態 SQL 執行模式:db2.jcc.pdqProperties=captureMode(OFF),
           executionMode(STATIC),allowDynamicSQL (FALSE),
           pureQueryXml(pureQueryFolder/capture.pdqxml)

(以上例子中使用了換行,這僅僅是為布局考慮) 。

運行應用程序三次。每次通過更改運行配置執行一條不同的代碼路徑: jdbc:db2://localhost:50000/GS_DB db2admin mypwd 1
jdbc:db2://localhost:50000/GS_DB db2admin mypwd 2
jdbc:db2://localhost:50000/GS_DB db2admin mypwd

示例應用程序現在應該能夠成功地靜態執行它的 SQL 語句。

結束語

恭喜!您已經成功使用 Data Studio Developer 為一個現有的 JDBC 應用程 序啟用了 pureQuery。為了簡單起見,我們選擇了一個簡單的應用程序,而且沒 有討論計劃階段。計劃階段不僅識別應用程序是否適合啟用 pureQuery 的,並且 產生一些本教程基於其上的配置和部署決策。此外,在一個典型的用例中,有一 些重要的方面必須考慮;下面列出了其中一部分:

安全性:在本教程中,您將數據庫對象安全模型從基於數據庫對象換成基於包 。這一變化對於誰能成功地運行應用程序會產生影響。

有些 JDBC 編程實踐和通常的限制可能使您不能靜態地運行每條 SQL 語句。 因此,在某些情況下,如果需要完成靜態的 SQL 執行,必須修改 JDBC 應用程序 的實現。如果源代碼不能修改(例如,應用程序是第三方的),則不得不動態地 執行選擇的 SQL。

在中大型的項目中,可以使用 Data Studio Developer 將一些手動執行的任 務自動化。pureQuery 提供了一些命令行實用程序,可以用它們來簡化過程,例 如在批處理模式中將包綁定到多個測試或生產數據庫。

部署到生產以及角色的職責:通常,在為應用程序啟用 pureQuery 以及將這 樣的應用程序部署到測試和生產中時,會涉及多個具有不同角色的用戶。這些用 戶需要緊密協作,以確保成功地為目標應用程序啟用 pureQuery,以及部署和維 護目標應用程序。

致謝

我們要感謝 Kathy Zeidenstein 對本教程的貢獻,同時也感謝 Chris Farrar 審校了本教程。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved