f 最終回 徹底検証 本連載は何をもたらしたのか? 〜その栄光と挫折 実践 クライアント/サーバーデータベースソリューション 第22回

最終回
徹底検証
本連載は何をもたらしたのか?
〜その栄光と挫折

Access,VB6,Jetデータベースエンジンを利用した
C/Sシステム構築に関する考察,実験および実践



秋月巌ソリューション事務所
秋月 巌 AKIZUKI,Iwao



本連載のバックナンバーはPCDNのホームページで見ることができる

 今回は最終回なので、今までの総括をする。幸い、この連載のバックナンバーの多くをPCDNのホームページで閲覧することができる。大変見やすくホームページ化してくれたPCDNのボランティアの方々に感謝したい。
 この連載では多くの挫折も経験したが、Microsoft発表の技術資料の焼き直し以上の情報を提供できたと思う。人は失敗から多くのことを学ぶことができる。今回で最終回を迎えるのは、先月号でも説明したようにクライアント/サーバーシステムをめぐる状況が連載当初とは一変したことが大きい。現在はWindows用のローコストなデータベースサーバーが存在するほか、Linuxのような無料のデータベースサーバーがあるOSもメジャーになった。また、データベースシステムの主流は、Webベースになる変化の途上である。

スタートはピュアだった。いや、最後までピュアだった

 本連載は、1998年4月号よりJetデータベースエンジンとSQL Server 6.5のパフォーマンスを比較することから始まった。SQL Server 6.5のベンチマークは使用許諾の関係で公表することができなかったが、両者のパフォーマンスは多くの場面で同等であり、いくつかの場面ではJetデーターベースエンジンがSQL Serverをわずかに上回った。ただ、テーブルスキャン(インデックスを使用しない検索)では、SQL Server 6.5がJetデータベースエンジンを大きく上回った。
 このSQL Server 6.5とJetデータベースエンジンのパフォーマンスに差が少ない事実は、SQL Server 6.5にとって決して不名誉な結果ではない。SQL Server 6.5にはJetデータベースエンジンとは比較にならないほどの耐障害性があり、それを実現しながらも同等のパフォーマンスを発揮できるということが、その真価だからである。
 また、前回のトラフィック量調査でもわかるように、ファイル共有型のデータベースエンジンであるJetデータベースエンジンは、ネットワークを使用してマルチユーザーで使用した場合、パフォーマンスが致命的に劣化する可能性がある。

ファイル共有型データベースをデータベースサーバー化する

 それならば、Jetデータベースエンジンをサーバーデータベースとして使用できる仕組みさえ用意すれば、ファイル共有型データベースエンジンの最大の弱点を克服できることになる。ファイル共有型のデータベースエンジンはネットワークファイルI/Oを利用するため、自前で通信機能を用意する必要はない。しかし、データベースサーバーとして動作させるためには、通信機能を装備する必要がある。そこで株式会社ナルボの「Easy Socketコントロール」を使用して通信機能を実装したのが1998年5月号「第2回 いきなりデータベースサーバー完成!である(図1・2)。
 Easy Socketコントロールを採用したのは、TCP/IPサーバーをもっとも簡単に作成できる方法だったからである。Visual Basic付属のWinsockコントロールでもTCP/IPサーバーを作ることはできるが、これはコントロール配列を使用して複数クライアントからの要求に対応する必要がある。Easy SocketコントロールはVisual Basicから操作される関係上、イベントの処理はシングルスレッドで行なわれるが、通信処理自体はマルチスレッド化される。ただし、このサンプルではデータベースアクセスそのものがシリアライズされているため、マルチスレッドのメリットはない。通信やイベント処理を含めた完全なマルチスレッド化は、この後も長い間、重要な課題として残されることになる。

図1:Type1 DB Server
図1:Type1 DB Server

図2:Type1 DB Client
図2:Type1 DB Client

まずはシンプルにスタート

 この第2回で作成したType1データベースサーバーは、取得したデータを単にテキストボックスに表示することしかできなかった。また、データのやりとりにバリアント配列を使用したため、パフォーマンスが極端に悪かった。単に動くというだけのもので、実用性はなかった。しかし、コントロールと簡単なプログラミングだけで、データベースサーバーとして動作していたことは事実である。

データの配信にWebサーバーを使用する方法もある

 1998年6月号「第3回 ファイルにアクセスするか、データベースにアクセスするか、それがWebサーバーとデータベースサーバーとの違いである1998年7月号「第4回 自作HTTPクライアントによる、データベースアクセスでは、Visual Basicを使ってWebサーバーとHTTPクライアントを作成した(図3・4)。データベース関連の記事でWebサーバーとHTTPクライアントについて解説したのは、「ファイル共有型のデータベースをクライアント/サーバー型のデータベースとして利用するためには、データの配信メカニズムが必要であり、その機能はWebサーバーと構造的には同じである」ということを明示したかったからである。
 図4を見てもらうとわかるが、HTTPクライアントといってもWebブラウザではない。返信されたHTMLソースをそのまま表示しているだけである。図5は同じHTTPクライアントを使ってActive Server Pagesにアクセスし、データベースクライアントとして活用したものである。

図3:Webサーバーサンプル(リクエストを受け付けた状態)
図3:Webサーバーサンプル(リクエストを受け付けた状態)

図4:Visual BasicのWinsockコントロールを利用したHTTPクライアント
図4:Visual BasicのWinsockコントロールを利用したHTTPクライアント

図5:Active Server Pagesを使ってHTTPクライアントからデータベースにアクセス
図5:Active Server Pagesを使ってHTTPクライアントからデータベースにアクセス

HTTPを使用するべきだったのかは、後悔するところだ。

 Active Server Pagesはサーバー側でデータベースにアクセスし、HTTPクライアントにその結果を配信する機能をもつ。その機能をクライアント側から利用することで、IIS+Active Server Pagesをデータベースサーバーとして利用しているのである。この方法は本誌1999年6月号の特集で掲載された拙稿Visual Basicクライアントアプリケーションから、Transactional ASPを利用するでさらに進化した方法を紹介している。
 HTTPを使用する方法の解説は、第4回で終了する。これ以降は独自プロトコルを使用したデータベースサーバーの開発に進むわけだが、正直いえば、HTTPに被せるプロトコルを使用し、IISを利用する方法を推し進めていったほうが時代のニーズにあった結果を提供できたかもしれないという後悔も若干ある。しかし、独自サーバーを使用したおかげで、この連載の最大の収穫ともいえるVisual Basicによる完全なTCP/IPマルチスレッドサーバーを後に開発することができたので、よしとしよう。

データ転送が遅いデータベースサーバーは、やっぱり遅い
〜バリアント配列からテキストへ

 1998年8月号「第5回 データ転送の高速化を実現で発表したType2およびType3 DB Serverでは、データの転送にバリアント配列を使用していたのものを文字列に変更し、データ転送の高速化をはかった。当初バリアント配列を使用したのは、文字区切りなどの処理を省略することでプログラミングを簡略化するためだった。しかし、それによってパフォーマンスがかなり犠牲になっていることが判明したので、文字列によるデータ転送に変更したのである。Type3 DB Serverでは、大量の結果セットを転送する際、文字列を一括で転送せず分割して転送するように修正することで、更なる高速化を実現した。

マルチユーザーに本格的に対応。その秘密はActiveX.EXEコンポーネント

 1998年9月号「第6回 マルチユーザーに対応し、並行処理可能のデータベースサーバーで解説したType 4 DB Serverでは、マルチユーザーに完全に対応するため、アーキテクチャ上の大きな変更を行なった。データベースサーバーはマルチユーザーマネジメントサーバー(図6)とDBアクセスサーバー(図7)に分離され、DBアクセスサーバーはActiveX.EXEとして実装された。
 マルチユーザーマネジメントサーバーは、単にユーザーからの接続を受けつけるためだけに存在する。クライアントからの接続要求がくると、マルチユーザーマネジメントサーバーはDBアクセスサーバーを起動し、クライアントの接続情報を渡した後で接続を切断する。
 起動されたDBアクセスサーバーは、接続情報をもとにクライアントにコールバックし、クライアントがそれを受け付けた時点で接続が完全に完了し、データベースへのアクセスが可能になる。
Type4 DB Serverの問題点は、接続の仕組みが複雑なことと、接続あたりの使用メモリが極端に大きいことである。各接続ユーザーごとにマルチプロセスでDBアクセスサーバーを起動するため、メモリの消費がどうしても大きくなってしまう。しかし、データベースへのアクセスは各ユーザーごとに完全に分離されるため、複数ユーザーによるクエリーの同時実行に対応できるようになったのである。

図6:マルチユーザー接続を管理するマルチユーザーマネジメントサーバー(Type4 DB Server)
図6:マルチユーザー接続を管理するマルチユーザーマネジメントサーバー(Type4 DB Server)

図7:各ユーザーごとのデータベースアクセスを担当するDBアクセスサーバー(Type4 DB Server)
図7:各ユーザーごとのデータベースアクセスを担当するDBアクセスサーバー(Type4 DB Server)

データの編集も可能になり、最低限の機能が揃う

 Type5 DB Serverが完成するのは1998年11月号「第8回 複数のSQL文の同時処理とデータの編集である。このバージョンでは、次の点が改善された。

  1. 実行されたSQL文が間違っていた場合のエラーハンドリング
  2. SELECT文以外のSQL文も実行が可能
  3. 複数のSQL文の処理が一度の送信で可能
  4. ログイン時の並行処理が可能
 最大の進歩はSELECT文以外のSQL文が実行できるようになったことで、データの編集、追加、削除が可能になったことである。ようやく実用のための最低限の機能が揃ったということができる。

ADOのRecordsetオブジェクトを使用する

 1998年12月号「第9回 ADOのレコードセットを使用したクライアントの実装で発表したType6 DB Serverからは、開発するツールをVisual Basic 6.0(以下VB6)にバージョンアップしている。VB6に新しく付属したADOのRecordsetオブジェクトを利用し、サーバーから受信した結果セットをクライアント側でRecordsetオブジェクトに格納した。その結果、クライアントのプログラミングで結果セットを扱うときに、文字列の切り貼りではなく汎用的なコードを記述できるようになった。データベースは単独で完結するものとではなく、必ずクライアントアプリケーションとセットで使用される。それを考えれば、クライアント側のプログラミング効率を上げるためにコンポーネントとして扱うことができることは重要である。

データ連結が可能になり、実用性のあるアプリケーションを開発

 1999年1月号「第10回 Type7 DB Server−任意のテーブルからレコードセットを作成では、VB6で新しくサポートされたデータ連結コントロールの作成機能を使用している。図8はグリッドコントロールとテキストボックスにデータを連結したフォームである。続く、1999年2月号「第11回 Type7 DB Serverを使ったクライアントアプリケーションでは、単にテスト用にデータを表示するだけではない実用性のあるアプリケーションを作成した。図9がその「著者情報検索アプリケーション」である。このアプリケーションではマスター詳細フォームを採用し、著者名を検索すると、その著作が表示できるようにした。結局、この「著者情報検索アプリケーション」が本連載で唯一実用性のあるアプリケーションになった。しかし、まだClient Libraryができる前なので、データベースアクセスのためのコードは抽象化されておらず、アプリケーションに埋め込まれている。

図8:グリッドへのデータ連結を行なったクライアント
図8:グリッドへのデータ連結を行なったクライアント

図9:著者情報検索アプリケーション
図9:著者情報検索アプリケーション

マルチスレッド

 1999年3月号「第12回 マルチスレッドSocketサーバーによる、データベースサーバーの実現のType8 DB Serverでは、遂に完全なマルチスレッド化を実現する。Visual Basicがマルチスレッドアプリケーションの開発に対応していないことはご存知の方も多いと思う。その制限をクリアするには、いくつかの方法が考えられる。CreateThread API関数を使う強力な方法もあるが、Type8 DB Serverで採用したのは、ActiveX.EXEをマルチスレッドで使用する方法である。
 ActiveX.EXEが別のプロセスで動作するActiveX.EXEコンポーネントだということはよく知られている。しかし、複数のActiveX.EXEのインスタンスを、COMクライアントとは異なるひとつのプロセス内で同時にマルチスレッドで動作させることができるということは、あまり知られていない。この方法を用いることで複数のDBアクセスサーバーをマルチスレッドでロードできる。そして、結果的にメモリの消費を極端におさえることができる。この方法はマルチスレッドで動作させるために最低ふたつのプロセスを起動する必要がある。ひとつはCOMクライアントが起動するプロセスであり、もうひとつはActiveX.EXE(COMサーバー)が起動するプロセスである。しかしCOMクライアントのプロセスは、ActiveX.EXEを起動した直後にシャットダウンするため問題とはならないだろう。
 また、ユーザー接続を待機するユーザー接続リクエストブローカとDBアクセスサーバーが同じプロセスで動作することでSocket IDが共有できるようになり、Type4 DB Server以来の問題点だったコールバック方式を廃止することができた。コールバック方式は接続の仕組みが複雑であるうえに、クライアント側はTCP/IPサーバーとなるため、複数のアプリケーションをクライアント側で起動できないという問題点もあった。
 Visual BasicでマルチスレッドのTCP/IPサーバーが作れるということは、多くの可能性を生むことに気付くだろう。ここで紹介した方法はトリッキーな方法でもなく、また、COMアーキテクチャにも準拠しているので、十分に勧めることができる。個人的には、この完全なマルチスレッド化がDB Serverの最大の進歩だったと考えている。
 1999年4月号「第13回 コンポーネント化されたHyper SQLdb Client Libraryが、プログラミングを簡素化するから4回にわたり、クライアント側のコンポーネントであるHyper SQLdb Client Libraryを実装している。Hyper SQLdb Client Libraryは、Type9 DB Serverにアクセスするための専用コンポーネントで、プログラミングスタイルにADOとの互換性をもたせるために最大限の努力をしている。使用するユーザーからみれば、DB Serverのためだけに新しいプログラミングスタイルを覚えなければならないことは大きなコストとなる。この点を考えると、ADOのプログラミングスタイルを踏襲できることには意味がある。

クライアントをコンポーネント化する

 また、ActiveX.DLLではなくActiveXコントロールとして実装し、データ連結にも対応した。ActiveX.コントロールとして実装したことには、私のポリシーの問題もある。コンポーネントの作成に関して、かなり突っ込んだ調査もしているので参考になるだろう。ただ、本誌読者がデータベースアクセスのためのコンポーネントを作成する機会が多くないことを考えると、どのように記事に意味をもたせるか苦労した。

立ちはだかったAccess 2000の壁

 1999年8月号「第17回 Access 2000はType x DB Serverのクライアント開発ツールになりえるか?以降では、クライアントにMicrosoft Access 2000を使用するための調査を行なった。かなりの苦労をした結果、玉砕したことは記憶に新しい。「Access 2000はMicrosoft SQL Server 7.0(とJetデータベースエンジン)にアクセスするアプリケーションを開発するのには優れたツールだが、その強力なユーザーインターフェイス開発機能をほかのデータベースエンジンのために使用することは難しい」。これが、苦労の末に私が得た結論である。
 この連載の打診が最初にあったとき、その内容は「Microsoft Accessによるクライアントアプリケーションの開発」という内容だった。「それだったら、サーバーも作りましょう」と提案したのは私自身である。当時のMicrosoft Accessのアーキテクチャは、クライアント/サーバーシステム開発ツールとしては致命的な問題点があり、それはサーバーを自作したところで回避できるものではなかった。しかし、連載を続けてゆくうちに事態はかわるかもしれないと考えていた。実際、Access 2000はSQL Server 7.0用の開発ツールとして強化された。私はほかのデータベースサーバーに対しても十分に使えると判断したし、そう判断するだけの十分な理由があった。このあたりは記事にも詳しく書いた。しかし……。

最後の告白

 こうして今までの記事のサマリーを書いていると、ノスタルジックな気分になる。1年程度前の記事でも、もう数年前のことのような気がするのはなぜだろう。この一年間の技術的な進歩が激しかったからだろうか? いや、Visual Basicだけに限れば、Visual Basic 5.0発売に匹敵する飛躍的な進歩はない。本連載で紹介した技法は今でも通用することばかりだし、また、ほかの単行本や雑誌原稿では触れられていないものばかりである。現在でもインターネットで閲覧できることを考えれば、十分に意味のある活動だったと確信している。
 最後に、本連載のサンプルコードのほとんどは、妻の陽子が書いたものであることを告白しておこう。


VB Magazine ライブラリ| Visual Basic WorkGroup
int21 ホームページ| PCDN ホームページ

PCDN
Copyright (c) 1998 int21 CorporationAll Rights Reserved.
For questions or comments, please send mail to: pcdn@int21.co.jp