DB2のNoSQLによるJSONサポート機能(第4部): IBMによるDB2に対応するNoSQLの通信リスナーを使用する

アプリケーション環境が急速に変化するなか、さまざまなアプリケーション・レイヤー間でデータを保存・交換するための柔軟なメカニズムが必要となっています。JSON (JavaScript Object Notation)はスキーマ設計のオーバーヘッドを削減し、データ加工を行う必要がないため、モバイル環境をサポートするインタラクティブなアプリケーションの構築のためには不可欠なテクノロジーとなっています。

DB2のNoSQLによるJSONサポート機能を活用すると、開発者はMongoDBに基づいて作成したポピュラーなJSONベースのクエリー言語を使用することによって、IBM DB2 for Linux, UNIX, and Windowsに保存されたデータを処理するアプリケーションを作成することができます。ドライバー・ベースの本ソリューションは実績のあるエンタープライズ機能と高い質のサービスを提供するRDBMSと連携し、JSONによるデータの柔軟な表示を実現します。DB2のNoSQLによるJSONサポート機能は、JSON文書を処理するにあたってコマンドライン・プロセッサー、Java API、および通信リスナーをサポートします。

この記事では、IBMによるDB2に対応するNoSQLの通信リスナーについて紹介します。本通信リスナーはMongoDBの通信プロトコルに基づいてメッセージを解析します。そのため、MongoDBのコミュニティーに提供されるさまざまなドライバーを使用し、これらのドライバーを使用する際に身に着けたスキルを活用することによって、DB2をJSONストアとして使用したうえでJSON文書の保存・更新・検索を行うことができます。

Ioannis Papapanagiotou, Ph.D., ETI Solutions Developer, IBM

Ioannis Papapanagiotou photoIoannis PapapanagiotouはWebSphereのCTOに業務報告を行っているIBM社内の新規ソリューション開発チームであるEmerging Technology Institute (ETI)のメンバーであり、ミドルウェア・システムのフロントエンド・キャッシュとデータ・ストア・システムを担当しています。Ioannisはノースカロライナ州立大学からコンピューター・エンジニアリングとオペレーションズ・リサーチの博士号を取得しています。データの冗長性の排除と無線ネットワークに関する数多くの論文の著者であり、本件に関する特許を申請しています。



Marion Behnen, DB2 JSON and Spatial Development, IBM

Marion BehnenはIBMのソフトウェア・グループでシニア・ソフトウェア・エンジニアを務め、NoSQLによるJSONサポート機能を担当しています。NoSQLに取り組む前には、MarionはDB2アプリケーションとデータウェアハウス・アプリケーションのコンポーネントに関するテクニカル・リーダーを務めていました。IBMで勤務する以前は、Marionはビジネス・プロセスとデータ統合にさまざまな形で関わり、特に製造業のデータベース・アプリケーションの開発を担当していました。


developerWorks 貢献著者レベル

John Paul Parkin, WebSphere eXtreme Scale Developer , IBM

JP Parkin photoJohn Paul Parkinは現在トロントでWebSphere eXtreme Scaleの開発チームに属し、シリアライゼーションの最適化とNoSQLインターフェースを担当しています。JPは15年にわたってIBMでさまざまな製品(DB2、InfoSphere Warehouse、およびWebSphere eXtreme Scaleなど)に関するソリューションの開発を行っています。



2013年 10月 21日

はじめに

IBMによるDB2に対応するNoSQLの通信リスナー(以下、「通信リスナー」と言います)は、以下の機能を提供します。

  • 開発者はJSON文書ストアを処理する際に身に着けたスキルを活用することによって、DB2を使用することができます。
  • MongoDBドライバーとMongoDBのコマンドシェルのコマンドで作成したアプリケーションをサポートします。
  • BSON文書を処理するにあたって、DB2によるJSONサポート機能に基づくAPIが提供する機能を活用できます。

背景情報

最新のWebユーザー・インターフェースの開発においては、Web 2.0に対応するJavaScriptがよく使用されています。JavaScriptはモバイル・アプリケーションやインタラクティブなやり取り行うアプリケーションに最適であるため、JavaScriptのデータ交換形式であるJSONは多くのユーザーによってWebに最適な言語と考えられていいます。JSON形式のメリットとしては、スキーマ設計のオーバーヘッドを削減することによってスキーマの柔軟性を高め、俊敏な開発を実現することが挙げられます。

このため、ミッドティアのアプリケーション・レイヤーとコミュニケーションするためには通常HTTP REST/JSONが使用されます。この結果、JSONをネイティブでサポートする文書ストア(MongoDBなど)の開発が行われ、本文書ストアの導入が進んでいます。MongoDBのようなNoSQLベースのストアはサーバー・サイドのJavaScript(NodeJSなど)と緊密に連携します(両方とも同じ言語を使用し、JSON文書を処理することができるため)。この2種類のコンポーネントを組み合わせることによって、高いスループットと一貫性が求められるリアルタイム・アプリケーションを迅速に開発することができます。


MongoDB

MongoDB(本データベースの名前は「巨大」を意味する“humongous”に由来する)は、スケーラビリティーとパフォーマンスが高いオープンソースのデータベースです。MongoDBは文書ストアです。すなわち、各文書は独自の構造を持つ単位として作成されます。MongoDBのAPIはJSONオブジェクトとJavaSciptの機能をネイティブ統合したものです。開発者はMongoDBを使用する際にデータストアのインスタンスにアクセスする言語ドライバー(Java、C/C++、Ruby、NodeJSなど)を使用することもできれば、シェル・プログラムを使用することもできます。このようなアプリケーションはMongoDBの通信プロトコル経由でデータベースにアクセスします。MongoDBの通信プロトコルはシンプルなソケット・ベースのリクエストとレスポンスを行うプロトコルです。クライアントはTCP/IPを使用してデータベース・サーバーとコミュニケーションします。


BSON形式

MongoDBは、BSON形式で保存されたスキーマを持たない文書をサポートします。BSON(バイナリーJSON)はJSON文書をバイナリー形式でシリアライズしたもので、JSONの仕様に合致するデータ型の表示を行うための拡張機能を提供します。BSONは、配列やネストされたオブジェクト(文書を他の文書内や配列内に組み込んだもの)のようなJSON構造をサポートします。

MongoDBに含まれるBSON文書はスキーマを持たないため、さまざまな構造を持つ文書のコレクションを構築することができます。文書構造が柔軟であるため、データがさまざまな似た属性を持つ場合や、属性がまばらに存在する場合や、急速に文書構造が変化する場合に効果を発揮します。その典型例として、Webアプリケーションに含まれる書籍に関するコレクションが挙げられます。書籍のエントリーを見ると、さまざまなデータが含まれていることが分かります。著者名とタイトルが含まれていることもあれば、ユーザー・レビュー、書籍の概要、または出版社に関する情報が含まれていることもあります。データの種類はさまざまですが、データのモデルと機能は同じです。


IBMによるNoSQLの通信リスナー

本記事で取り上げた通信リスナーを活用すると、DB2ユーザーはMongoDBのコミュニティーに提供されるさまざまなドライバーを活用することによって、DB2にJSONデータをネイティブ形式で保存し、検索を行うことができるため、DB2をJSON文書のストアとして活用することができます。

通信リスナーは、MongoDBの通信プロトコルの受け付けと処理を行うサーバー・アプリケーションであり、DB2によるJSONサポート機能に基づくAPIを使用して、DB2でBSON文書の処理と保存を行い、DB2からBSON文書を抽出します。以下の図は、MongoDB APIで開発したアプリケーションとDB2間で行われるコミュニケーションについて説明しています。

図1. IBMによるNoSQLの通信リスナーのアーキテクチャー
図1. IBMによるNoSQLの通信リスナーのアーキテクチャー

DB2に対応するJSONサポート機能を有効化する

DB2によるNoSQLのJSONサポート機能とは、DB2をJSON文書のストアとして使用するためのDB2 for Linux, UNIX, and Windows(バージョン10.5)で使用可能なドライバー・ベースのソリューションです。以下のステップでは、通信アプリケーションの環境を設定する方法について説明しています。DB2のインストール、データベース・プランニング、およびコマンドの実行環境に関するより詳しい情報が必要な場合は、DB2のインフォメーション・センターの情報を参照してください。


ステップ1: サーバーを設定する

JSONデータを保存するために、UTF-8データベースを作成します。ページ・サイズとして、32 Kを設定することをお勧めします。

リスト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にあります。

以下の例は、サーバー(ローカルホスト)またはクライアント(ホスト名または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

注意:

  • PATH.に"java"が含まれていることを確認すること。
  • CLASSPATHにJDBCドライバー(db2jcc.jarまたはdb2jcc4.jar)が含まれていることを確認すること。必要に応じて、CLASSPATHにjarファイルを追加するか、スクリプトに-cpを追加すること。
  • 本コマンドライン・プロセッサーには、データベースに接続するための情報が必要です。ユーザーがテーブルや関数を作成する管理者権限(NoSQLによるJSONサポート機能を有効化するために必要になる)を有していることを確認すること。

JSON のコマンドライン・プロセッサー環境の設定方法についてさらに確認したい場合は、「DB2のNoSQLによるJSONサポート機能(第2部): コマンドライン・プロセッサーを使用する」も読んでください。


IBMによるNoSQLのJSONサポート機能に基づく通信リスナー

ステップ3: 通信リスナーを起動する

通信リスナーの起動と停止を行うには、wplistenerスクリプト(< DB2のインストール・ディレクトリー> /json/binに存在)を使用します。通信リスナーはデータベースのホスト・サーバー上で起動する必要があり、Javaランタイム環境(JRE)はバージョン6以降が必要です。デバッグ・フラグはオプションですが、デバッグ・フラグを使用する場合は、ログパスは既存のフォルダーを指す必要があります。

リスト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は、JSONをサポートするためにステップ2で有効化したデータベース名と合致する必要があります。

これで通信リスナーは提供されるアプリケーション・メッセージを処理できるようになりました。通信リスナーを使用してコレクションを作成し、JSON文書の挿入と検索を行うサンプル・アプリケーションについては、本記事で提供されるMongoDBのコマンドラインのサンプルJSONをサポートするNodeJSのプログラミング例を参照してください。

注意: 通信リスナーを停止するには、接続情報に基づいて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>JSON文書のストアとして使用されるDB2のデータベース名
-debug通信リスナーのデバッグを有効化する
-help通信リスナーの使い方のヘルプを表示する
-host <DB2 host:port>リモートのDB2サーバーに接続する際に使用されるホスト名およびポート番号(host:port)
-logPath <path>実行ログ・ファイルを保存するためのパス
-maxTCPThreads <threads>TCPスレッドの最大数
-minTCPThreads <threads>TCPスレッドの最小数
-mongoPort <port>MongoDBのクライアント・リクエストをリッスンするポート
-noSQLHost <hostname>通信リスナーが稼働しているホストの名前
-password <password>バックエンド・サーバーのパスワード
-shutdown通信リスナーを停止する
-start通信リスナーを起動する
-userid <userid>バックエンド・サーバーのユーザーID

注意:全てのオプションが必要になるわけではありません。通信リスナーの起動と停止の際に使用される適切なオプションは、以下のとおりです。

  • <起動の際のオプション>: -mongoPort <port> -userid <userid> [ -logPath <path> ] [-password <password>] [-debug] [-minTCPThreads <threads>] [-maxTCPThreads <threads>]
  • <停止の際のオプション>: -mongoPort <port> -noSQLHost <hostname> -userid <userid> [ -logPath <path>] [-password <password>] [-debug]

-minTCPThreadsおよび-maxTCPThreadsは、提供されるワークロードのスレッド処理をサーバーのサイズと負荷に基づいて調整するために使用されるパフォーマンス引数です。これらの引数はオプションであり、ほとんどのユーザーは使用する必要はありません。


NoSQLをサポートするJSONに対するさまざまな処理

通信リスナーは、JSONの名前空間、コレクション、および文書を処理するためのさまざまなポピュラーな機能を提供します。提供される機能の例としては、以下が挙げられます。

  • コレクションを作成・削除(一部または全体の削除)する
  • インデックスを作成(保証)・削除(一部または全体の削除)する
  • 文書を挿入・更新・削除する
  • 文書をインポート・エクスポートする
  • 文書に対してfind, findOne, count, aggregate, distinct, groupを実行する
  • その他の機能

一部の処理は特定のデータベースに関する情報を戻すための機能であるため、メッセージや引数に関する一部のオプションが使用できない場合があります。

オプションを指定しない場合は、コレクションとインデックスが標準設定に基づいて作成されることに注意してください。サポートされる機能とその他の情報については、本シリーズの第3部(「Java APIを使用してアプリケーションを作成する」)およびその他の参照資料を読んでください。


MongoDBのコマンドラインのサンプル

データベースを定義する

MongoDB上でコレクションを作成するには、データベースを定義する必要があります。MongoDBではデータベース名が提供されない場合は、データベース名として"test"が使用されます。DB2との主な相違点としては、MongoDBデータベースのコンセプトがJSONの名前空間(DB2スキーマを指す)と合致していることです。そのため、MongoDBと同様に、データベースもアプリケーションの稼働中に定義することができます。上記の例では、-dbName jsondbに基づいて通信リスナーは起動されています。これは、指定されたJSONの名前空間をホストするDB2データベースを指しています。すなわち、MongoDBデータベースはDB2スキーマと同等であるということです。そのためMongoDBを使用することによって柔軟なシステムが実現し、開発中のどの時点でもMongoDBのデータベース名を定義することができます。

以下の例では、通信リスナーとともにMongoDBのシェルを使用することによってデータベースを選択する処理を示しています。

リスト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. NodeJSをサポートするMongoDBをインストールする
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によるDB2に対応するNoSQLの通信リスナーを起動する方法について説明しました。通信リスナーはMongoDBによる通信プロトコルに基づいてメッセーを解析し、開発者はMongoDBのコミュニティーに提供されるドライバーを使用することで身に着けたスキルを活用することによって、DB2によるNoSQLのJSONインターフェースを活用したアプリケーションを作成することができます。アプリケーションの計画を立てる際には、DB2によるJSONサポート機能に関する資料を参照することによって、DB2に適用される拡張機能や機能制限に注意する必要があります。

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management, Open source, Java technology
ArticleID=947448
ArticleTitle=DB2のNoSQLによるJSONサポート機能(第4部): IBMによるDB2に対応するNoSQLの通信リスナーを使用する
publish-date=10212013