第 1 步:到 Informix 數據庫的 JDBC 連接
開發到 Informix 的連接所需的 Java 庫是 Informix ClientSDK 軟件包。如果您的數據庫在不同的主機上,並且您的本地開發環境是不同的平臺(UNIX?0?3 數據庫服務器,Linux?0?3 開發環境),請確保根據運行 Java 代碼的平臺來下載 ClientSDK。
將合適的庫目錄添加到 ClientSDK 的 CLASSPATH 環境變量(它將包含 ifxjdbc.jar、ifxjdbcx.jar、ifxlang.jar 等等)。
數據服務器將只接受使用 TCP 接口的 JDBC 連接。這可能需要針對您的環境進行配置,並將需要編輯 /etc/hosts、onconfig 和 sqlhosts 文件。有關更多信息,請參閱 Informix Infocenter documentation。
要創建到 Informix 的 JDBC 連接,需要一個 URL 來確定目標數據庫,並提供合適的用戶憑據;例如:
jdbc:informix-sqli://10.0.0.102:40000/stores_demo:INFORMIXSERVER=demo_on_tcp;user=
informix;password=informix
使用 JDBC 連接到 Informix 的 Java 代碼示例:
...
static Connection informixConnection = null;
...
try {
Class.forName("com.informix.jdbc.IfxDriver");
} catch (Exception e) {
System.out.println("FAILED: failed to load Informix JDBC driver.");
}
try {
informixConnection = DriverManager.getConnection(jdbcURL);
} catch (SQLException e) {
System.out.println("FAILED: failed to connect!");
System.out.println(jdbcURL);
System.out.println(e.getMessage());
e.printStackTrace();
}
try {
informixConnection.setReadOnly(true);
} catch (SQLException e) {
e.printStackTrace();
}
在完成程序前需要以下代碼來關閉連接:
try {
informixConnection.close();
} catch (SQLException e) {
System.out.println("FAILED: failed to close the connection!");
}
System.out.println("Disconnect from source database.");
在上述例子中,一旦連接成功,活動連接將被保存在 “informixConnection” 變量中。
第 2 步:確定從 Informix 選擇的行和列(Select)
當將數據推向 WebSphere Information Integrator OmniFind Edition 時,需要幾部分信息。這包括可搜索的實際內容和幾部分元數據(包括惟一資源標識符(URI)),以便惟一地識別稍後檢索的行。該 URI 通常需要表中一個鍵記錄值,比如 ID 列。如果被推的數據不是普通文本數據(如以 blob 類型存儲的 Acrobat PDF 文件),則需要收集足夠的數據來建立 MIME 類型,以便解析器正確執行。
使用 STORES_DEMO 數據庫中的 CATALOG 表作爲例子,我們可能對搜索目錄描述(cat_descr 欄)感興趣。爲了惟一地標識每一行,我們將需要目錄 ID 號(catalog_num)。
select 語句類似如下: SELECT catalog_num, cat_descr FROM catalog
執行查詢的 Java 代碼爲:
...
// Execute the SELECT statement
stmt = informixConnection.createStatement();
ResultSet queryResults = stmt.executeQuery("SELECT catalog_num,cat_descr FROM catalog;");
// Get the result set
ResultSetMetaData queryResultsMetaData = queryResults.getMetaData();
int numOfCols = queryResultsMetaData.getColumnCount();
// For each row in the result set...
while (queryResults.next()) {
totalSelected = totalSelected 1;
// Build a URI for the row... table,id_column,id
uri = "informix://stores_demo/catalog/catalog_num/" queryResults.getString(1);
content_type = "text/plain";
// Grab the content which is in the cat_descr column
content = queryResults.getString("cat_descr").getBytes();
// Push the result to the DataListener and keep count of successes
...
} catch (Exception e) {
e.printStackTrace();
}
...
上述例子爲基本文本數據提供了一個牢固的起點。在本文附帶的 ids2omf.java 文件中, 編碼反映了需要檢查返回的數據類型(BLOB)並根據數據庫記錄建立正確的 MIME 類型。
第 3 步:爲 WebSphere Information Integrator OmniFind Edition 配置 DataListener 環境(Configure)
當 WebSphere Information Integrator OmniFind Edition 啓動時,DataListener 也默認啓動。但是,如果沒有在 WebSphere Information Integrator OmniFind Edition 環境中定義用戶並讓用戶憑據與集合中保持一致,Listener 將無法接受連接。
DataListener 配置可以在 System: DataListener (edit) 菜單中找到。該用戶 ID 的作用範圍僅限於到 WebSphere Information Integrator OmniFind Edition 中的 DataListener 的連接。
注意:在該菜單中使用了 “Collection Name”;但是實際上,“Collection_ID” 對於 DataListener 客戶端代碼正確操作是必需的。
圖 2. 配置 DataListener 屏幕
檢查 DataListener 的監視菜單顯示等待處理的請求(隊列),而不是已經處理的請求。當檢查您的代碼是否工作時(當我們開始測試時),該屏幕沒有提供大量有用的信息;但是,這是值得檢查的,可以確保 Listener 正在運行。
圖 3. DataListener 監視菜單
第 4 步:開發合適的代碼來連接 DataListener
實際的推操作是一個兩步過程。首先,元數據記錄需要被填充,第二步,元數據記錄和內容被真正推向 Listener。注意,實際內容被處理兩次,一次在元數據記錄中,一次在實際的推調用中。
大多數的元數據字段不是必需的;但是,如果您打算推非文本數據(比如 PDF 文件或 Word 文檔),內容類型是必需的。如果正確的內容類型未通過,解析器將出現問題,通常會拒絕該文檔(在我們的例子中,Stellant 解析器未能成功地建立正確的文檔類型)。通過基於 Web 的 WebSphere Information Integrator OmniFind Edition Administration 接口檢查日誌文件,確定您的內容是被解析器拒絕還是忽略。
到 Listener 的連接不是持久連接;因此,不必針對 “連接,在完成所有事情前循環,斷開連接” 進行編碼。
元數據對象編碼
...
// Build a default metadata object
DataSourceMetadata DSMetaData = DLDataPusher.createDataSourceMetadata(
"informix", // Datasource
"ids2omf", // Client application identifier
"informix", // Datasource name
0, // score (unused)
new Date(), // Date
"", // Language
", // Security access tokens
"text/plain", // Content type of content (mime type)
"", // Character set
content ); // Actual content
// call the push method
try {
DLResponse dlRes = DLDataPusher.pushData(hostname, port, clientID,
passwd, uri, collectionID, DSMetaData, content);
// check the result
if (dlRes != null)
if (dlRes.getCodeName() == "SUCCESS")
recordsPushed = recordsPushed 1;
else {
System.out.println("Problem pushing to OmniFind: URI:" uri "Problem:"
dlRes.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
...
Datasource 的 Client application identifier 和 datasource name 字段可以用您的環境中的任何信息來填充。這些值對於 WebSphere Information Integrator OmniFind Edition 正常工作不是必需的。
第 5 步:將所有內容放在一起
本文附帶的 ids2omf.java 文件實現了本文所描述的功能。要使代碼更靈活,所做的其他工作是讀取和解析一個 XML 參數文件,該文件定義 Informix 連接參數;SELECT 語句和關鍵列;以及 WebSphere Information Integrator OmniFind Edition 參數。
要編譯該代碼,以下 JAR 文件必須在您的 CLASSPATH 環境變量中可以訪問: siapi.jar、es.dl.client.jar、es.dl.server.jar、esapi.jar、ifxjdbc.jar、es.oss.jar、ifxtools.jar、ifxjdbcx.jar、ifxlang.jar、ifxlsupp.jar、ifxsqlj.jar
運行示例代碼
esadmin@linux:~/ids2omf> cat set_classpath.sh
export CLASSPATH=/opt/IBM/es/lib/siapi.jar:/opt/IBM/es/lib/es.dl.client.jar:
/opt/IBM/es/lib/es.dl.server.jar:/opt/IBM/es/lib/esapi.jar:/opt/IBM/es/lib/es.oss.jar:
/opt/IBM/informix/jdbc/lib/ifxjdbc.jar:/opt/IBM/informix/jdbc/lib/ifxtools.jar:
/opt/IBM/informix/jdbc/lib/ifxjdbcx.jar:/opt/IBM/informix/jdbc/lib/ifxlang.jar:
/opt/IBM/informix/jdbc/lib/ifxlsupp.jar:/opt/IBM/informix/jdbc/lib/ifxsqlj.jar:.
esadmin@linux:~/ids2omf> . ./set_classpath.sh
esadmin@linux:~/ids2omf> javac ids2omf.java
esadmin@linux:~/ids2omf> java -cp .:$CLASSPATH ids2omf sources.xml
-------------------------------------------------------------------------
Starting Informix to OmniFind utility
-------------------------------------------------------------------------
Input Parameter file:sources.xml
Informix URL: jdbc:informix-sqli://10.0.0.106:40000/stores_demo:
INFORMIXSERVER=demo_on_tcp;user=informix;password=informix
OmniFind Target:10.0.0.106:6668:test:test:col_33762
Source selections in parameter file: 1
Connected to source database.
-------------------------------------------------------------------------
Tables: cust_calls
Where_clause: ""
Key column:customer_num
Data Column: call_descr
Data Type Column: "text/plain"
Push complete: Records selected:7, Records pushed:7
Disconnect from source database.
-------------------------------------------------------------------------
esadmin@linux:~/ids2omf>
不推薦的 DataListener 方法
DataListener 接口在 WebSphere Information Integrator OmniFind Edition 的 Version 8.3 中已經不再推薦使用,取而代之的是一種更新型的接口。本文中使用的 Java 例子仍然如 Version 8.3 中所述的那樣運行;但是,在未來版本中,應該使用 Search 和 Index API 調用。
有關更多信息,請參閱 Programming Guide and API Reference V8.3 的第 4 章。