第 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 章。