DB2 NoSQL for JSON 功能,第 4 部分: 使用 IBM NoSQL Wire Listener for DB2

快速变化的应用程序环境需要一种灵活的机制来存储数据,并在不同应用程序层之间传输数据。事实证明,JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种适用于移动、交互式应用程序的重要技术,它减少了模式设计的开销,消除了数据转换的需求。

DB2® NoSQL JSON 使开发人员能够使用 MongoDB 创建的面向 JSON 的流行查询语言来编写应用程序,以便与 IBM DB2® for Linux®, UNIX®, and Windows® 中存储的数据进行交互。这个基于驱动程序的解决方案在 RDBMS 的上下文中实现了 JSON 数据表示的灵活性,具有著名的企业特性和服务质量。这项 DB2 NoSQL 功能支持使用一个命令行处理器、Java™ API 和有线监听器来处理 JSON 文档。

本文将介绍 IBM NoSQL Wire Listener for DB2。它基于 MongoDB 有线协议来解析消息,进而支持使用 MongoDB 社区驱动程序,以及在使用这些驱动程序时获得的技能,以便使用 DB2 作为 JSON 存储来存储、更新和查询 JSON 文档。

Ioannis Papapanagiotou, Ph.D., ETI 解决方案开发人员, IBM

Ioannis Papapanagiotou 的照片Ioannis Papapanagiotou 是 IBM Emerging Technology Institute (ETI) 的成员,ETI 是 WebSphere CTO 所负责的一个内部孵化器团队,研究用于前端缓存和数据存储系统的中间件系统。Ioannis Papapanagiotou 拥有北卡罗莱纳州立大学 的计算机工程和运筹学双哲学博士学位。他在数据冗余性消除和无线网络领域编写了多篇论文,并发明了多项专利。



John Paul Parkin, WebSphere eXtreme Scale 开发人员, IBM

JP Parkin 的照片 John Paul Parkin 目前是位于多伦多的 WebSphere eXtreme Scale 开发团队的成员,从事序列化优化和 NoSQL 接口研究。JP 在 IBM 花了 15 年为各种产品开发解决方案,这些产品包括 DB2、InfoSphere Warehouse 和 WebSphere eXtreme Scale。



2013 年 9 月 17 日

开始之前

IBM NoSQL Wire Listener for DB2(以下简称为 “有线监听器”)提供了以下特性:

  • 使开发人员能够将他们在使用 JSON 文档存储的过程中获得的技能用于 DB2 中。
  • 同时支持使用 MongoDB 驱动程序编写的应用程序和使用 MongoDB Command shell 命令编写的应用程序。
  • 利用 DB2 JSON API 提供的特性来处理 BSON 文档。

背景信息

现在 Web 用户界面开发的流行方法是 JavaScript for Web 2.0。JavaScript 是移动的、整洁的应用程序的关键,因此许多人将它的数据交换格式 JSON 视为 Web 的语言。JSON 格式的优势是,它实现了模式灵活性和开发,减少了模式设计开销。

在此上下文中,HTTP REST/JSON 通常用于与中间应用程序层进行通信。这已促进原生支持 JSON 的文档存储(比如 MongoFB)的发展,并被越来越多的人接受。MongoDB 等 NoSQL 存储非常适合服务器端 JavaScript(比如 NodeJS),因为二者都使用相同的语言,都理解 JSON 文档。这两种强大概念相结合,使得具有很高的吞吐量和并发性需求的实时应用程序的快速开发成为了可能。

MongoDB

MongoDB(来自 “巨大” 的含义)是一个可伸缩的、高性能的、开源的数据库。MongoDB 是一个文档存储;换言之,每个文档被编写为具有自己的独立结构的单元。MongoDB 的 API 是 JSON 对象和 JavaScript 函数的一种原生组合。开发人员通过一种访问数据存储实例的语言驱动程序(Java、C/C++、Ruby、NodeJS 等),或通过 shell 程序与 MongoDB 交互。这些应用程序通过 MongoDB 有线协议与数据库进行交互。MongoDB 有线协议是一个基于套接字、请求-响应风格的简单协议。客户端通过 TCP/IP 与数据库服务器进行通信。

BSON 格式

MongoDB 支持存储为 BSON 格式的无模式文档。BSON(二进制 JSON)是 JSON 文档的一种二进制编码的序列化形式,它包含的扩展支持 JSON 规范的数据类型表示形式。它包含对 JSON 结构的支持,比如数组和嵌套对象(一个文档包含在其他文档或数组中)。

MongoDB 中的 BSON 文档没有模式,这使得构建包含不同结构的文档的集合成为可能。文档结构的灵活性在一些领域很有用,比如在数据具有不同但类似的属性、稀疏的属性或快速演化的文档结构的领域中。一个经典的示例是,Web 应用程序中的一个图书集合。给定一些图书条目,您将看到它们表示不同的数据:一些条目包含作者和标题,其他条目包含用户的评论、摘要或关于出版公司的信息。数据各不相同,但模型或功能是相同的。

IBM NoSQL Wire Listener

本文将介绍有线监听器,它使 DB2 用户能够利用 MongoDB 社区驱动程序在 DB2 中原生地存储和查询 JSON 数据,进而将 DB2 用作 JSON 文档存储。

有线监听器是一个服务器应用程序,它接受和处理 MongoDB 有线协议。它利用一个 DB2 JSON API 来处理、存储并从 DB2 中检索 BSON 文档。下图显示了使用 MongoDB API 和 DB2 开发的应用程序之间的通信。

图 1. IBM NoSQL Wire Listener 架构
应用程序使用 MongoAPI 向有线监听器提交请求,后者使用 DB2 JSON Java API 通过 DB2 客户端来处理 DB2 服务器上的操作。

实现对 DB2 的 JSON 支持

DB2 NoSQL JSON 是一个可用于 DB2 for Linux, UNIX, and Windows 10.5 的基于驱动程序的解决方案,它使 DB2 更容易用作 JSON 文档存储。以下步骤将展示如何为一个有线应用程序准备好环境。请参阅 DB2 信息中心,了解 DB2 安装、数据库规划和命令执行环境的详细信息。

第 1 步:配置服务器

创建一个 UTF8 数据库来存储 JSON 数据。建议使用 32K 页面大小。

清单 1. 服务器配置
db2 create database jsondb automatic storage yes using codeset
     utf-8 territory us collate using system pagesize 32 K

如果尚未给 TCP/IP 配置数据库服务器,则在数据库服务器上打开 TCP 通道来监听从 JDBC 驱动程序传入的请求。下面的示例使用了默认端口号 50000。

清单 2. 打开 DB2 端口
db2set DB2COMM=TCPIP
db2 update dbm cfg using svcename 50000
db2stop
db2start

第 2 步:启用 DB2 数据库

要为数据库启用 JSON 支持,可使用 db2nosql JSON 命令行处理器运行 enable 命令。您可在数据库服务器上提交该命令,或在客户端上执行它。脚本位于 <DB2 安装目录>/json/bin 中。

下面的示例显示了如何通过服务器 (localhost) 或客户端(使用主机名或 TCP/IP 地址)上的 db2nosql 命令行处理器执行 enable 命令。

清单 3. Windows(本地和远程示例)
db2nosql.bat -user bob -hostName localhost -port 50000 
             -db jsondb -setup enable -password mypassword

db2nosql.bat -user bob -hostName bob.bobhome.com -port 23023 
             -db jsondb -setup enable -password mypassword
清单 4. Linux 或 UNIX(本地和远程示例)
./db2nosql.sh -user bob -hostName localhost -port 50000
              -db jsondb -setup enable -password mypassword

./db2nosql.sh -user bob -hostName bob.bobhome.com -port 23023 
              -db jsondb -setup enable -password mypassword

备注:

  • 确保 “java” 包含在 PATH 中。
  • 确保 JDBC 驱动程序(db2jcc.jar 或 db2jcc4.jar)包含在类路径中。如果有必要,可将 jarfile 添加到脚本中的 CLASSPATH 或 -cp 中。
  • 命令行处理器需要连接到数据库所需的信息。确保用户拥有适当的管理特权来创建表和函数,启用 NoSQL JSON 功能需要它们。

另请参阅 DB2 NoSQL JSON 功能,第 2 部分:使用命令行处理器,了解设置 JSON CLP 环境的更多信息。


IBM NoSQL JSON Wire Listener

第 3 步:启动监听器

有线监听器可使用 wplistener 脚本来启动和停止,该脚本位于 <DB2 安装目录>/json/bin 中。有线监听器必须在数据库主机服务器上启动,而且需要第 6 版或更高版本的 Java 运行时环境 (JRE)。-debug 标志是可选的,但是,如果使用了它,logpath 必须指向现有的文件夹。

清单 5. Windows
wplistener.bat -start -mongoPort 27017 -userid <db2admin> -password <mypasswd> 
                      -dbName <dbName> 

wplistener.bat -start -mongoPort 27017 -userid <db2admin> -password <mypasswd> 
                      -dbName <dbName> -debug -logPath c:/temp/logs
清单 6. Linux 或 UNIX
./wplistener.sh -start -mongoPort 27017 -userid <db2admin> -password <mypasswd> 
                       -dbName <dbName>

./wplistener.sh -start -mongoPort 27017 -userid <db2admin> -password <mypasswd> 
                       -dbName <dbName> -debug -logPath /usr/temp/logs

-dbName 必须与 第 2 步 中启用了 JSON 支持的数据库名称相匹配。

有线监听器现在已可处理传入的应用程序消息。请参阅本文后面的 MongoDB 命令行示例JSON NodeJS 编程示例,了解使用有线监听器来创建一个集合,插入和查询 JSON 文档的示例应用程序。

备注:要停止有线监听器,可使用 wplistener 脚本和连接信息来发送一个关闭请求,如下面的示例所示。

清单 7. Windows
wplistener.bat  -shutdown -noSQLHost localhost -mongoPort 27017 
                            -dbName <dbName> -userid <db2admin>
清单 8. Linux 或 UNIX
./wplistener.sh  -shutdown -noSQLHost localhost -mongoPort 27017 
                               -dbName <dbName> -userid <db2admin>

请注意,-noSQLHost 指的是要关闭的有线监听器的地址。

一般选项

有线监听器支持使用一组输入参数来指定连接信息和确定运行时参数,如下面的清单所示。

清单 9. 有线监听器参数
-dbName <DB2 database>     DB2 database name used as the JSON document store
-debug                     Enable debug for the wire listener
-help                      Display usage help for the wire listener
-host <DB2 host:port>      hostname and port when connecting
                           to a remote DB2 server(host:port)
-logPath <path>            Path for storing execution log files
-maxTCPThreads <threads>   Maximum number of TCP Threads
-minTCPThreads <threads>   Minimum number of TCP Threads
-mongoPort <port>          Port that is listening for MongoDB client requests
-noSQLHost <hostname>      Name of the Host running the wire listener
-password <password>       Password for the backend server
-shutdown                  Stop the wire listener
-start                     Start the wire listener
-userid <userid>           Userid for the backend server

备注:不是所有选项都是必需的。下面列出了有效的 start 和 shutdown 选项:

  • <start options> : -mongoPort <port> -userid <userid> [ -logPath <path> ] [-password <password>] [-debug] [-minTCPThreads <threads>] [-maxTCPThreads <threads>]
  • <shutdown options> : -mongoPort <port> -noSQLHost <hostname> -userid <userid> [ -logPath <path> ] [-password <password>] [-debug]

-minTCPThreads 和 -maxTCPThreads 是性能参数,可根据服务器和负载的大小来调节传入工作的线程处理。这些是可选参数,大多数用户没有必要使用它们。


NoSQL JSON 操作

有线监听器支持使用大多数常见操作来处理 JSON 命名空间、集合和文档。举例而言,这些操作包括:

  • 创建、删除和丢弃集合
  • 创建(保证)、删除和丢弃索引
  • 插入、更新和删除文档
  • 导入和导出文档
  • 查找、查找一个、计数、聚合、区分、分组文档
  • ……等等……

请注意,一些操作返回特定于数据库的信息,所以一些消息或参数选项可能不适用。

另请注意,如果没有指定选项,将会使用默认设置来创建集合和索引。请参阅 本系列介绍 DB2 JSON Java API 的使用的第三部分 和参考文档,了解支持的功能的详细信息和其他详细信息。


MongoDB 命令行示例

定义一个数据库

对于要在 MongoDB 中创建的一个集合,必须定义一个数据库。在 MongoDB 中,如果未提供数据库名称,则会使用数据库 “test”。该数据库与 DB2 的主要区别是,MongoDB 数据库的概念与一个 JSON 命名空间相匹配,该命名空间使用一种 DB2 模式来表示。因此,像 MongoDB 一样,数据库可在应用程序运行时期间定义。在上面的示例中,有线监听器是使用 -dbName jsondb 来启动的。这是将用来托管指定的 JSON 命名空间的 DB2 数据库。换言之,一个 MongoDB 数据库等效于一个 DB2 模式。这提供了与 MongoDB 相同的灵活性,而且允许在开发阶段的任何时间点定义任何 MongoDB 数据库名称。

下面的示例展示了如何结合使用 MongoDB shell 和有线监听器来选择一个数据库:

清单 10. 定义一个数据库
> use mydb
Switched to db mydb

这将在 DB2 数据库中创建一个名为 MYDB 的 JSON 命名空间或 SQL 模式。

创建一个集合

集合的 MongoDB 等效实体是 DB2 表。在首次使用 MongoDB 时,它会隐式创建一个集合。类似地,在 DB2 中,会在首次使用时创建一个表。

清单 11. 创建一个集合
> db.mycollection.insert({"_id":1 , "name":"Ioannis"})

> show collections
mycollection
system.indexes

存储和查询数据

下面的清单显示了一些插入、更新、查找和删除文档的示例操作。集合将自动创建。

清单 12. 示例操作
> db.mycollection.insert({"_id":1 , "name":"Ioannis"})
> db.mycollection.findOne()
{ "_id" : 1, "name" : "Ioannis" }
> db.mycollection.update({"_id":1},{$set:{"name":"Marion"}})
> db.mycollection.findOne()
{ "_id" : 1, "name" : "Marion" }
> db.mycollection.insert({"_id":2, "name":"JP", "last":"Parkin"})
> db.mycollection.find()
{ "_id" : 1, "name" : "Marion" }
{ "_id" : 2, "name" : "JP", "last" : "Parkin" }
> db.mycollection.remove({"name":"JP"})
> db.mycollection.count()
1

JSON NodeJS 编程示例

该示例需要 MongoDB Node.js 驱动程序,可以使用以下命令安装它:

清单 13. 安装 MongoDB for NodeJS
npm install mongodb
清单 14. 一个简单的 NodeJS 示例
var Db = require('mongodb').Db;
var Connection = require('mongodb').Connection
var Server = require('mongodb').Server
var format = require('util').format;

var mongo = {
        "host": "localhost",
        "port": "27017",
        "db": "mydb"
};

var db = mongo.db;
console.log("Connecting mongo at: " + mongo.host + ":" + mongo.port + ":" + mongo.db);

Db.connect(format("mongodb://%s:%s/%s?w=1", mongo.host, mongo.port, mongo.db), 
   function(err,  db) {
        db.collection('sample', function(err, collection) {
            // Start with a clean collection
            collection.remove({}, function(err, result) {
    
            // Insert a JSON document
            collection.insert({name:'Joe'},{w:1}, function(err,res){    
             collection.findOne({name:'Joe'}, function(err, item) {
              console.log("created at " + new Date(item._id.generationTime) + "\n")   

               // Insert multiple JSON documents with different schema
               for(var i = 0; i < 5; i++) {
                 collection.insert({'a':i}, {w:0});
               }
    
               // Count documents
               collection.count(function(err, count) {
                 console.log("There are " + count + " records in the sample collection.");
                   collection.find().each(function(err, item) {
                        if(item != null) {
                            console.dir(item);
                        }

                        // Null signifies end of iterator
                        if(item == null) {
                            // Destory the collection
                            collection.drop(function(err, collection) {
                                db.close();
                            });
                        }
                    });
                });
            });
        });
    });
    });
});

结束语

本文介绍了如何通过一些简单步骤启用 JSON 支持和运行 IBM NoSQL Wire Listener for DB2。有线监听器基于 MongoDB 有线协议来解析消息,开发人员可使用他们研究 MongoDB 社区驱动程序所获取的技能,编写利用 DB2 NoSQL JSON 接口的应用程序。在规划应用程序时,一定要查阅 DB2 JSON 文档,考虑那些特定于 DB2 的扩展和限制。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, Open source, Java technology
ArticleID=945303
ArticleTitle= DB2 NoSQL for JSON 功能,第 4 部分: 使用 IBM NoSQL Wire Listener for DB2
publish-date=09172013