用于DB2的IBM NoSQL Wire Listener,以下称为“ wire listener”,提供以下功能:
现代Web用户界面开发的流行方法是Web 2.0 JavaScript。 JavaScript是吸引人的移动应用程序的关键,因此它的数据交换格式JSON被许多人视为网络语言。 JSON格式的优点在于,它通过减少架构设计开销来提供架构灵活性和开发敏捷性。
在这种情况下,HTTP REST / JSON通常用于与中间层应用程序层进行通信。 这导致了本机支持JSON的文档存储(例如MongoDB)的开发和接受度的提高。 像MongoDB这样的NoSQL存储可以与服务器端JavaScript(例如NodeJS)一起很好地工作,因为它们都讲相同的语言,并且可以理解JSON文档。 这两个功能强大的概念的结合,可以快速开发对吞吐量和并发性有很高要求的实时应用程序。
MongoDB(来自“巨大”)是一个可扩展的,高性能的开源数据库。 MongoDB是一个文档存储; 换句话说,每个文档都以其自己的独立结构作为一个单元编写。 MongoDB的API是JSON对象和JavaScript函数的本机混合。 开发人员可以通过访问数据存储实例的语言驱动程序(Java,C / C ++,Ruby,NodeJS等)与MongoDB进行交互,也可以通过Shell程序与MongoDB进行交互。 此类应用程序通过MongoDB有线协议与数据库交互。 MongoDB有线协议是一种简单的基于套接字的请求-响应样式协议。 客户端通过TCP / IP与数据库服务器通信。
MongoDB支持以BSON格式存储的无模式文档。 BSON(二进制JSON)是JSON文档的二进制编码序列化,并包含一些扩展名,这些扩展名可以表示JSON规范的数据类型。 它包括对JSON结构(如数组或嵌套对象以及其他文档或数组中的文档)的支持。
MongoDB中的BSON文档是无模式的,这使得构建具有不同结构的文档集合成为可能。 文档结构的这种灵活性在例如数据具有变化但相似的属性,稀疏属性或快速发展的文档结构的领域中很有用。 一个经典的例子是Web应用程序中的藏书。 给定一堆书条目,您将看到它们呈现不同的数据:一些包含作者和书名,其他包含用户的评论,其他包含摘要,或有关出版公司的信息。 数据各不相同,但型号或功能相同。
本文介绍了有线侦听器,该侦听器使DB2用户能够利用MongoDB社区驱动程序在DB2中本地存储和查询JSON数据,从而将DB2用作JSON文档存储。
有线侦听器是一个服务器应用程序,它接受并处理MongoDB有线协议。 它利用DB2 JSON API从DB2处理,存储和检索BSON文档。 下图展示了使用MongoDB API开发的应用程序与DB2之间的通信。
DB2 JSON是基于驱动程序的解决方案,可用于Linux,UNIX和Windows 10.5的DB2以及IBM DB2 Accessories Suite V3.1来与z / OS V10上的DB2一起使用。 它有助于将DB2用作JSON文档存储。 以下步骤显示了如何为有线侦听器应用程序准备环境。
有关DB2安装,数据库计划和命令执行环境的详细信息,请参阅DB2信息中心 。
步骤1:配置服务器
创建一个UTF8数据库来存储JSON数据。 建议使用32K页面大小。
db2 create database jsondb automatic storage yes using codeset
utf-8 territory us collate using system pagesize 32 K
如果尚未为TCP / IP配置数据库服务器,请打开数据库服务器上的TCP通道以侦听来自JDBC驱动程序的传入请求。 以下示例使用默认端口号50000。
db2set DB2COMM=TCPIP
db2 update dbm cfg using svcename 50000
db2stop
db2start
步骤2:启用DB2数据库
要为数据库启用JSON支持,请使用db2nosql JSON命令行处理器运行enable
命令。 您可以在数据库服务器上提交命令,也可以在客户端上执行命令。 脚本位于
以下示例说明如何通过服务器(localhost)或客户机(具有主机名或TCP / IP地址)上的db2nosql命令行处理器执行enable命令。
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
./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
笔记:
另请参阅DB2 JSON功能,第2部分:使用命令行处理器,以获取有关设置JSON CLP环境的更多详细信息。
应用程序可以在分布式系统平台上使用DB2 JSON API或DB2 JSON WireListener,并使用DB2 Connect JDBC驱动程序将DB2 for z / OS用作JSON数据存储。
此部署方案需要以下组件:
使用DB2 for z / OS,启用数据库将由DB2 for z / OS数据库或系统管理员作为一次性安装任务执行。 z / OS不支持通过db2nosql命令行工具启用该功能。 有关在z / OS上使用DB2启用DB2 JSON的详细信息,请参见APAR PM98357。
在分布式系统上对数据库进行分类,并记下用于DB2 JSON客户端的z / OS上的连接信息或DB2数据库的URL。
可以使用位于wplistener
脚本来启动和停止有线监听器。
请参见清单5和6中的示例来启动有线侦听器。
wplistener.bat -start -mongoPort 27017 -userid -password
-dbName
wplistener.bat -start -mongoPort 27017 -userid -password
-dbName -debug -logPath c:/temp/logs
./wplistener.sh -start -mongoPort 27017 -userid -password
-dbName
./wplistener.sh -start -mongoPort 27017 -userid -password
-dbName -debug -logPath /usr/temp/logs
-dbName必须与在步骤2中为JSON支持启用的数据库名称匹配。
有线侦听器现在准备处理传入的应用程序消息。 请参阅本文后面的MongoDB命令行示例和JSON编程示例,以获取使用有线侦听器创建集合以及插入和查询JSON文档的示例应用程序。
注意:要停止连线监听器,请使用wplistener脚本和连接信息来发送关闭请求,如以下示例所示。
wplistener.bat -shutdown -noSQLHost localhost -mongoPort 27017
-dbName -userid
./wplistener.sh -shutdown -noSQLHost localhost -mongoPort 27017
-dbName -userid
请注意,-noSQLHost引用用于关闭的有线侦听器的地址。
Wire Listener支持一组输入参数来指定连接信息,并确定运行时参数,如下面的清单所示。
-dbName 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 hostname and port when connecting
to a remote DB2 server(host:port)
-logPath Path for storing execution log files
-maxTCPThreads Maximum number of TCP Threads
-minTCPThreads Minimum number of TCP Threads
-mongoPort Port that is listening for MongoDB client requests
-noSQLHost Name of the Host running the wire listener
-password Password for the backend server
-shutdown Stop the wire listener
-start Start the wire listener
-userid Userid for the backend server
注意:并非所有选项都是必需的。 下面列出了有效的启动和关闭选项:
-minTCPThreads和-maxTCPThreads是性能参数,可用于根据服务器和负载的大小来限制传入工作的线程处理。 这些是可选参数,大多数用户不必使用它们。
有线侦听器支持与JSON名称空间,集合和文档一起使用的最常见操作。 例如,这些包括
请注意,某些操作返回特定于数据库的信息,因此某些消息或参数选项可能不适用。
如果未指定任何选项,还请考虑使用默认设置创建集合和索引。 请参阅DB2 JSON功能,第3部分:使用JAVA API和参考文档,以获取有关受支持功能的详细信息和其他详细信息。
为了在MongoDB中创建一个集合,必须定义一个数据库。 在MongoDB中,如果未提供数据库名称,则使用数据库“ test”。 与DB2的主要区别在于,MongoDB数据库的概念与JSON名称空间匹配,该名称空间由DB2模式表示。 因此,与MongoDB一样,可以在应用程序运行时定义数据库。 在上面的示例中,有线侦听器从-dbName jsondb
启动。 这是将托管指定的JSON名称空间的DB2数据库。 换句话说,MongoDB数据库由DB2模式表示。 这提供了与在MongoDB中使用数据库相似的灵活性,并且允许您在开发阶段的任何时间定义任何符合DB2模式命名约定的MongoDB数据库名称。
以下示例显示了将MongoDB shell与有线侦听器结合使用来选择数据库:
> use mydb
Switched to db mydb
这将在DB2数据库中创建一个名为MYDB的JSON名称空间或SQL模式。
与集合等效的MongoDB是DB2表。 MongoDB首次使用时会隐式创建一个集合。 类似地,在DB2中,表是在第一次使用时隐式创建的。
> db.mycollection.insert({"_id":1 , "name":"Ioannis"})
> show collections
mycollection
system.indexes
以下清单显示了一些用于插入,更新,查找和删除文档的示例操作。 该集合将自动创建。
> 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
这些示例需要可使用以下命令安装的MongoDB Node.js驱动程序:
npm install mongodb
清单14中所示的示例应用程序将一些文档插入到集合中。
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});
}
});
});
});
});
});
清单15中显示的示例Python应用程序将插入一些文档并在集合中搜索这些文档。
import pymongo
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client.items
db.mycol.drop()
# inserting into mycol collection.
db.mycol.insert({'model': 'AB1234', 'type': 'bottom freezer', 'price': 2000})
db.mycol.insert({'model': 'XY9876', 'type': 'french doors', 'price': 1200})
db.mycol.insert({'model': 'OP4567', 'type': 'side-by-side', 'price': 800})
db.mycol.insert({'model': 'OP4599', 'type': 'bottom freezer', 'price': 1800})
q = {'price' : {'$gt': 1200, '$lte': 2000}}
# looking for the items with the price greater than 1200 and less than or equal to 2000.
aaa = db.mycol.find(q).sort("price")
# printing the document
for doc in aaa:
print (doc)
请注意,默认情况下,插入操作在单独的事务中是异步的。 因此,根据资源和时间的不同,您可能会看到比插入的文档数量小的列表。 请参阅清单16中的代码示例以获取一个node.js示例,以等待访问文档,直到所有插入操作完成。
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
function insert(i)
{
if (i < 5)
{
collection.insert({'a':i}, {w:1}, function(err,res)
{
insert(i + 1);
});
}
else
{
// 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();
});
}
});
});
}
};
insert(0);
}); // end findOne
}); //end insert
}); //end remove
}); //end collection
}); // end connect
请参阅本系列的其他文章,以讨论允许减少事务开销的替代方法。
本文展示了如何通过一些简单的步骤来启用JSON支持并为DB2运行IBM NoSQL Wire Listener。 连线侦听器基于MongoDB连线协议解析消息,开发人员可以使用与MongoDB社区驱动程序一起获得的技能来编写利用DB2 JSON接口的应用程序。 在计划应用程序时,请确保查看DB2 JSON文档以说明特定于DB2的扩展和限制。
翻译自: https://www.ibm.com/developerworks/data/library/techarticle/dm-1306nosqlforjson4/index.html