nosql db_使用IBM NoSQL Wire Listener for DB2

在你开始前

用于DB2的IBM NoSQL Wire Listener,以下称为“ wire listener”,提供以下功能:

  • 使开发人员能够将DB2与他们使用JSON文档存储所获得的技能一起使用。
  • 同时支持用MongoDB驱动程序编写的应用程序和MongoDB Command Shell命令
  • 利用DB2 JSON API提供的功能来处理BSON文档。

背景资料

现代Web用户界面开发的流行方法是Web 2.0 JavaScript。 JavaScript是吸引人的移动应用程序的关键,因此它的数据交换格式JSON被许多人视为网络语言。 JSON格式的优点在于,它通过减少架构设计开销来提供架构灵活性和开发敏捷性。

在这种情况下,HTTP REST / JSON通常用于与中间层应​​用程序层进行通信。 这导致了本机支持JSON的文档存储(例如MongoDB)的开发和接受度的提高。 像MongoDB这样的NoSQL存储可以与服务器端JavaScript(例如NodeJS)一起很好地工作,因为它们都讲相同的语言,并且可以理解JSON文档。 这两个功能强大的概念的结合,可以快速开发对吞吐量和并发性有很高要求的实时应用程序。

MongoDB

MongoDB(来自“巨大”)是一个可扩展的,高性能的开源数据库。 MongoDB是一个文档存储; 换句话说,每个文档都以其自己的独立结构作为一个单元编写。 MongoDB的API是JSON对象和JavaScript函数的本机混合。 开发人员可以通过访问数据存储实例的语言驱动程序(Java,C / C ++,Ruby,NodeJS等)与MongoDB进行交互,也可以通过Shell程序与MongoDB进行交互。 此类应用程序通过MongoDB有线协议与数据库交互。 MongoDB有线协议是一种简单的基于套接字的请求-响应样式协议。 客户端通过TCP / IP与数据库服务器通信。

BSON格式

MongoDB支持以BSON格式存储的无模式文档。 BSON(二进制JSON)是JSON文档的二进制编码序列化,并包含一些扩展名,这些扩展名可以表示JSON规范的数据类型。 它包括对JSON结构(如数组或嵌套对象以及其他文档或数组中的文档)的支持。

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

IBM NoSQL Wire侦听器

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

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

图1. IBM NoSQL Wire Listener体系结构
nosql db_使用IBM NoSQL Wire Listener for DB2_第1张图片

为DB2启用JSON支持

DB2 JSON是基于驱动程序的解决方案,可用于Linux,UNIX和Windows 10.5的DB2以及IBM DB2 Accessories Suite V3.1来与z / OS V10上的DB2一起使用。 它有助于将DB2用作JSON文档存储。 以下步骤显示了如何为有线侦听器应用程序准备环境。

Linux,Unix和Windows上的DB2

有关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命令。 您可以在数据库服务器上提交命令,也可以在客户端上执行命令。 脚本位于 / 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驱动程序(3.66或更高版本的db2jcc.jar或db2jcc4.jar)包含在类路径中。 如有必要,将jar文件添加到CLASSPATH或db2nosql脚本中的-cp中。
  • 命令行处理器需要连接数据库所需的信息。 确保用户具有创建表和函数的适当管理特权,这是启用DB2 JSON功能所必需的。

另请参阅DB2 JSON功能,第2部分:使用命令行处理器,以获取有关设置JSON CLP环境的更多详细信息。

z / OS上的DB2

应用程序可以在分布式系统平台上使用DB2 JSON API或DB2 JSON WireListener,并使用DB2 Connect JDBC驱动程序将DB2 for z / OS用作JSON数据存储。

此部署方案需要以下组件:

  • 带有DB2 JSON和DB2驱动程序组件的DB2 10.5 FP3(或更高版本),用于Linux,Unix和Windows服务器或客户机安装。 安装后,这些组件位于SQLLIB / json中。
  • DB2附件套件V3.1。
  • 具有必需的APAR的DB2 for z / OS版本10:有关先决条件和DB2 JSON与DB2 for z / OS一起安装的详细信息,请参阅APAR II14727。

使用DB2 for z / OS,启用数据库将由DB2 for z / OS数据库或系统管理员作为一次性安装任务执行。 z / OS不支持通过db2nosql命令行工具启用该功能。 有关在z / OS上使用DB2启用DB2 JSON的详细信息,请参见APAR PM98357。

在分布式系统上对数据库进行分类,并记下用于DB2 JSON客户端的z / OS上的连接信息或DB2数据库的URL。

IBM NoSQL JSON有线监听器

步骤3:设定并启动连线监听器

可以使用位于 / json / bin中的wplistener脚本来启动和停止有线监听器。 有线侦听器必须从Java运行时环境(JRE)版本6或更高版本启动,并且需要信息才能连接到数据库。 -debug标志是可选的,但如果使用它,则日志路径必须指向现有文件夹。

  • 确保“ java”在PATH中。
  • 确保JDBC驱动程序(3.66或更高版本的db2jcc.jar或db2jcc4.jar)包含在类路径中。

请参见清单5和6中的示例来启动有线侦听器。

清单5. Windows
wplistener.bat -start -mongoPort 27017 -userid  -password  
                      -dbName  

wplistener.bat -start -mongoPort 27017 -userid  -password  
                      -dbName  -debug -logPath c:/temp/logs
清单6. Linux或UNIX
./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脚本和连接信息来发送关闭请求,如以下示例所示。

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

请注意,-noSQLHost引用用于关闭的有线侦听器的地址。

常规选项

Wire Listener支持一组输入参数来指定连接信息,并确定运行时参数,如下面的清单所示。

清单9. Wire监听器参数
-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

注意:并非所有选项都是必需的。 下面列出了有效的启动和关闭选项:

  • <开始选项>:-mongoPort <端口>-用户ID <用户ID> [-logPath <路径>] [-密码<密码>] [-调试] [-minTCPThreads <线程>] [-maxTCPThreads <线程>]
  • <关闭选项>:-mongoPort <端口> -noSQLHost <主机名>-用户标识<用户标识> [-logPath <路径>] [-密码<密码>] [-调试]

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

DB2 JSON操作

有线侦听器支持与JSON名称空间,集合和文档一起使用的最常见操作。 例如,这些包括

  • 创建,删除,删除集合
  • 创建(确保),删除,删除索引
  • 插入,更新,删除文档
  • 进出口文件
  • 查找,查找,计数,汇总,不同,分组文档
  • ... 还有很多 ...

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

如果未指定任何选项,还请考虑使用默认设置创建集合和索引。 请参阅DB2 JSON功能,第3部分:使用JAVA API和参考文档,以获取有关受支持功能的详细信息和其他详细信息。

MongoDB命令行示例

定义数据库

为了在MongoDB中创建一个集合,必须定义一个数据库。 在MongoDB中,如果未提供数据库名称,则使用数据库“ test”。 与DB2的主要区别在于,MongoDB数据库的概念与JSON名称空间匹配,该名称空间由DB2模式表示。 因此,与MongoDB一样,可以在应用程序运行时定义数据库。 在上面的示例中,有线侦听器从-dbName jsondb启动。 这是将托管指定的JSON名称空间的DB2数据库。 换句话说,MongoDB数据库由DB2模式表示。 这提供了与在MongoDB中使用数据库相似的灵活性,并且允许您在开发阶段的任何时间定义任何符合DB2模式命名约定的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程式设计范例

这些示例需要可使用以下命令安装的MongoDB Node.js驱动程序:

清单13.安装MongoDB for NodeJS
npm install mongodb

JSON NodeJS编程示例:插入文档

清单14中所示的示例应用程序将一些文档插入到集合中。

清单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});
               }
    
            });
        });
    });
    });
});

JSON Python编程示例

清单15中显示的示例Python应用程序将插入一些文档并在集合中搜索这些文档。

清单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示例,以等待访问文档,直到所有插入操作完成。

JSON NodeJS编程示例:插入和读取文档

清单16.具有插入和查找功能的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
                    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

你可能感兴趣的:(数据库,python,linux,mysql,java)