天天看點

WebSpehre Message Broker 資料庫操作

一、          ODBC資料源

MB是通過ODBC來操作資料庫的,是以首先要配置好作業系統本身的ODBC資料源。Windows中配置ODBC很容易,在此不贅述細節。需要注意的是,選擇Oracle資料源驅動時,一定要選擇下圖所示的MB自帶的Oracle驅動

WebSpehre Message Broker 資料庫操作

我在建立ODBC時,一開始沒有在本機安裝Oracle,結果ODBC無法使用,報告“由于系統錯誤126,驅動程式無法加載”,問了IBM的技術支援也沒有答案,後來幹脆在本機安裝了一個Oracle(不必運作),問題就解決了,估計MB自帶的Oracle驅動還是要調用Oracle本身的一些庫的。我對Oracle本身基本不懂,具體用到了哪些庫也不清楚,就先這麼用着了。

二、          資料庫設定

這裡順手提一下Oracle本身的設定。當你建立了Oracle的ODBC資料源後,會發現資料源設定裡面,沒有IP和端口設定。我在網上搜了一下,最簡單的方法是直接修改Oracle的tnsnames.ora檔案,這個檔案位于: $oracle_root/product/10.1.0/db_1/NETWORK/ADMIN/tnsnames.ora 路徑下,可以用記事本打開編輯。裡面本身已經有樣例了,參照着改很容易

三、          消息流節點

MB中能和資料庫打交道的節點有很多,包括filter、compute,和專門的資料庫節點,如下圖:

基本上,凡是屬性裡面可以設定“資料源”的節點,都可以操作資料庫。使用方法很簡單,直接在“資料源”屬性中填入作業系統的相應ODBC資料源名稱即可。

WebSpehre Message Broker 資料庫操作

四、          代理broker的設定

這是最後一處要設定的地方。前面的tns檔案解決了ip和端口的問題,但是資料源本身的使用者名和密碼在消息流中并沒有提及,其實這是通過MB的一個指令來設定的,格式如下:

mqsisetdbparms brokerName -n dataSourceName [-udataSourceUserId] -p dataSourcePassword

具體用法可以輸入 mqsisetdbparms /h獲得參考

配置完以上内容後,運作消息流應該不會有資料庫連接配接的異常了。假如配置不正确,會在運作到使用了“資料源”的節點處抛出ODBC的一些異常

在WMBT中建立資料庫項目

以上做的工作可以確定消息流能夠正确操作使用者資料庫,但是當你在WMBT中編寫SQL語句時,會出現很多警告,内容一般是“無法解析資料庫表引用:某字段”。雖然不影響運作,但看着總是不太爽。

出現警告的原因很簡單,你沒有告訴WMBT你需要用到的資料庫表的結構是什麼,是以WMBT很盡職地告訴你可能有問題,我們隻需引入資料庫的定義,即可消除這些警告。

首先,打開“資料庫資料總管”視圖,建立一個JDBC連接配接,和其他EclipseIDE類似,配置好相關參數即可。

WebSpehre Message Broker 資料庫操作

在WMBT中建立一個“資料庫定義”,向導會讓你順便建立一個“資料庫設計項目”,你可以通過剛剛建立的JDBC連接配接,選擇一個資料庫,即可。

這時你會發現ESQL代碼中那些煩人的提示已經消失了。

在ESQL中編寫SQL語句

ESQL中使用SQL和一般的SQL語句基本一緻,除了在指定哪個資料表的時候,要用類似下面的文法:

SELECT  FROMDatabase.SchemaName.TableName

其中的“Database”是關鍵字,一定要有的,表示從資料庫中讀取,這是因為ESQL中不單可以操作資料庫,還可以對邏輯樹、數組對象使用select、delete等SQL文法,“Database”起到辨別的作用。

給出這樣一條語句:

set LocalEnvironment.temp[] = select * fromDatabase.TEST.example

假設example有id和info兩個字段,共三條記錄,那麼執行後的結果是LocalEnvironment樹下面産生三個temp元素,每個元素都包含一個id和info子元素,對應資料庫的記錄。

select傳回的都是數組類型,是以不能set LocalEnvironment.temp= select ….,那樣會在打包時報錯,一定要标明是數組

此外,像上面那樣直接書寫SQL語句并指派給一個數組變量,MB會在編譯和執行期間檢查SQL文法是否合格,這個特性雖然很有用,但有時候也會适得其反,比如要在Oracle使用序列來實作主鍵自增時,insert語句要寫成:

insert into example (id,info) VALUES ( SEQ_EXAMPLE.nextval ,‘xxxxx’)

這裡SEQ_EXAMPLE是序列的名稱。而在MB裡面這樣會儲存,提示找不到SEQ_EXAMPLE這個對象的定義。解決方法是使用ESQL的PASSTHRU函數,這個函數直接将SQL語句發送給資料庫去解析執行,就可以繞開MB的檢查。