MB 是通过 ODBC 来操作数据库的,因此首先要配置好操作系统本身的 ODBC 数据源。 Windows 中配置 ODBC 很容易,在此不赘述细节。需要注意的是,选择 Oracle 数据源驱动时,一定要选择下图所示的 MB 自带的 Oracle 驱动
我在创建 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 数据源名称即可。
四、 代理 broker 的设置
这是最后一处要设置的地方。前面的 tns 文件解决了 ip 和端口的问题,但是数据源本身的用户名和密码在消息流中并没有提及,其实这是通过 MB 的一个命令来设置的,格式如下:
mqsisetdbparms brokerName -n dataSourceName [-udataSourceUserId] -p dataSourcePassword
具体用法可以输入 mqsisetdbparms /h 获得参考
配置完以上内容后,运行消息流应该不会有数据库连接的异常了。假如配置不正确,会在运行到使用了“数据源”的节点处抛出 ODBC 的一些异常
在WMBT 中创建数据库项目
以上做的工作可以确保消息流能够正确操作用户数据库,但是当你在 WMBT 中编写 SQL 语句时,会出现很多警告,内容一般是“无法解析数据库表引用:某字段”。虽然不影响运行,但看着总是不太爽。
出现警告的原因很简单,你没有告诉 WMBT 你需要用到的数据库表的结构是什么,所以 WMBT 很尽职地告诉你可能有问题,我们只需引入数据库的定义,即可消除这些警告。
首先,打开“数据库资源管理器”视图,新建一个 JDBC 连接,和其他 EclipseIDE 类似,配置好相关参数即可。
在 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的检查。
WebSpehre Messager Broker 数据库操作
标签:esb websphere wmb 数据库
查看更多关于WebSpehre Messager Broker 数据库操作的详细内容...