RDO2.0の新機能

Updated 1997/08/03

By 富士通SSL)福岡寿和


RDO2.0の新機能―スタンドアロン オブジェクト―
RDO2.0の新機能―バッチカーソル―
RDO2.0の新機能―バッチ更新―
RDO2.0の新機能―イベントドリブン―
RDO2.0の新機能―ユーザーコネクションデザイナ―
RDO2.0の活用−RDO2.0をOracleで使ってみる−


みなさんは、RDOを使っていますか?
RDOは、ODBCドライバさえ揃えばデータベースに依存しないプログラムインターフェイスを提供します(図1)。

ですから、もっと普及していてもいいはずですが、思ったほど開発で使われていないようです。これは、RDOがRDBMSに対応したODBCドライバの機能や性能に影響を受けることが原因かもしれません。

Visual Basic 5.0になって、RDO(Remote Data Object)は1.0から2.0に変わりました。今回のバージョンアップでは、全体的な動作をDAO(Data Access Object)に合わせる方向に修正した以外に、様々な新機能も追加されています。

  1. スタンドアロンオブジェクト
  2. バッチカーソル
  3. バッチ更新
  4. イベントドリブン
  5. ユーザーコネクションデザイナ

しかし、RDOがODBCを使うことに変更はありません。 なお、RDOは、Visual Basic 5.0のEnterprise版以上で使えます。

    RDO1.0との相違点
  1. rdoQueryオブジェクト
    RDO1.0のrdoPreparedStatementsオブジェクトは廃止され、rdoQueryオブジェクトに変わりました。
    これは、オブジェクトの名前を判りやすいものに変更しただけのようです。
    オブジェクト構造などに変更はありません(図2)。
  2. rdoResultsetオブジェクト
    RDO 1.0は、 rdoResultsetオブジェクトに既に割り当てられている変数を OpenResultsetメソッドを使って別の rdoResultsetオブジェクトに設定しても、既存のオブジェクトは開いたままで、rdoResultsetsコレクションからも削除されませんでした。
    しかし、RDO2.0では、既存のrdoResultsetオブジェクトは閉じられて、rdoResultsetsコレクションからも削除されます。
    これは、DAOと動作を合わせるための仕様変更です。

図2 RDO2.0のオブジェクト構造図

RDO2.0の新機能―スタンドアロン オブジェクト―

  1. rdoCreateEnvironmentメソッドを使って rdoEnvironmentオブジェクトを作成するときに引数Name を指定しなかったときは、スタンドアロンの rdoEnvironment オブジェクトが作成されます。スタンドアロンrdoEnvironment オブジェクトを使うと、データベースと実際に接続する前に、ODBC 環境を管理できます。
  2. 通常、rdoConnectionオブジェクトのCursorDriver、LoginTimeout、UserName、Passwordの各プロパティは、rdoEngineオブジェクトの既定値に設定され、rdoConnectionオブジェクトからは変更できませんでした。しかし、スタンドアロンrdoConnectionオブジェクトを使うとオブジェクトを新規に作成して、各プロパティに値を設定してから、データベースと実際に接続します。
スタンドアロンrdoConnectionオブジェクトを新規に作成するには、次のようなコードを実行します。

Set rdcnnODBC = New rdoConnection

そして、プロパティの値を設定したらEstablishConnectionメソッドを使ってデータベースと実際に接続します。

rdcnnODBC.EstablishConnection

スタンドアロンrdoConnectionオブジェクトを宣言したとき、または EstablishConnectionメソッドを使用したときは、スタンドアロンrdoConnectionオブジェクトがrdoConnectionsコレクションに自動的に追加されません。スタンドアロンrdoConnectionオブジェクトを rdoConnectionsコレクションに追加するにはrdoConnections.Addメソッドを、rdoConnectionsコレクションから削除するにはrdoConnections.Removeメソッドをそれぞれ使用します。

RDO2.0の新機能―バッチカーソル―

RDO1.0までは、 ODBCドライバマネージャによって選択されるRDOカーソルライブラリに
の2通りの方法がありました.RDO2.0では更にバッチカーソルが追加されました。

☆RDOの復習―ODBCカーソル―
ODBCカーソルは、データベースの検索結果や現在処理しているレコードの情報をクライアント側のメモリ(および仮想メモリ領域のディスク上)に格納します。このため、データベースの検索結果を得るときに、サーバーからクライアントに多くのデータが流れます。この仕様は、検索結果のレコード数が少ないときはまだ良いのですが、検索結果のレコード数が増加すると、急激に処理速度が低下します。テスト環境と実環境でデータベースのデータ件数の違いから検索結果のレコード数が異なるときは注意が必要です。
しかし、ODBCカーソルは、データベースの構成などの影響を受けない特徴があります。そのため、データベースサーバーが実運用中であったり、管理が他社であったりするためにデータベースの構成を変更できないときに有効なカーソルです。

☆RDOの復習―サーバーカーソルー
サーバーカーソルは、データベースの検索結果や現在処理しているレコードの情報をサーバーのtempdbに格納します。このため、ネットワークやクライアントの資源を使わないので、従来のODBCカーソルよりも大幅に性能が向上します。ただし、ユーザー数が多く、カーソルが大きすぎてサーバーの資源を使い切ってしまうようなときには適しません。
また、サーバーカーソルをサポートしていないデータベースもあるので、開発に入る前に動作確認をした方が良いでしょう。

● バッチカーソル
RDO2.0の新機能であるバッチカーソルは、一度に大量のレコードを読込んできてそのほとんどを変更するようなときに効果的です。バッチカーソルは、レコードに対する処理全体が終了してから実際にデータベースへデータを反映するので、サーバーやネットワークへの影響を最小に押さえることができて、他のカーソルよりも良好な性能を示します。

ODBCカーソル、サーバーカーソル、バッチカーソルのカーソル移動性能をサンプルプログラム(リスト1図3)で測定した結果は、図4のようになります。このグラフで、途中からODBCカーソルの性能が極端に悪くなっていることが判ります。これは、ある件数以上の結果セットに対してカーソルを移動したときに、ディスクスワップが発生するためです。

RDO2.0の新機能―バッチ更新―

ODBCカーソルとサーバーカーソルには同時更新時の問題があります。例えば、アプリ1とアプリ2が同じレコードを読み込み、アプリ1がすぐに更新したとします。その後、アプリ2がそのレコードを更新しようとするとエラーが発生します(図5・6・7)。

図5 サーバーカーソルサンプルでの同時更新の結果

図6 ODBCカーソルサンプルでの同時更新の結果

図7 同時更新の問題

これが同時更新の問題です。バッチカーソルを使ってバッチオプティミスティック更新(以下、バッチ更新とします)すれば、この問題を回避することができます。

また、バッチ更新はRDC(リモートデータコントロール)でも使えるので、RDCとバインドしたDbGridの更新をカレント行の移動ではなくプログラムで制御できます。そのため、カレント行が移動したときよりも、一覧表示されている内容をすべて確認したときにデータベースの値が変わるような仕様の実現にもバッチ更新は効果的です。

RDO2.0の新機能―イベントドリブン―

☆RDOの復習―同期メソッド−
同期実行はRDOのメソッドの一番基本的な機能になります。例えば、ConnectメソッドやOpenResultsetメソッドを実行すると接続が成功したり、結果セットが生成されるまで、そのメソッドの次の行に制御が移りません。
同期実行は、プログラムがシンプルに作れる利点がありますが、処理が完了するまでアプリケーションが反応しなくなる欠点があります。

☆RDOの復習―非同期実行−
ConnectメソッドやOpenResultsetメソッドを実行するときに非同期オプションを使うと、制御がすぐにアプリケーションに戻ってきます。そして、アプリケーションは、StillConnectプロパティやStillExecuteプロパティの値を定期的に確認しながら、他の処理を実行できます、また、ボタンのクリックなどの他のイベントも発生しますので、利用者が時間がかかりすぎると思ったら、処理を中止することもできます(
リスト3)。

● イベントドリブン
Visual Basic 5.0とRDO2.0を使うとrdoEngineオブジェクト、rdoConnectionオブジェクトおよびrdoResultsetオブジェクトにイベントを付加できます(表2)。

表2 追加されるイベント
オブジェクトイベント
rdoEngine InfoMessage ODBCドライバからエラー情報が返却された。
rdoConnection BeforeConect サーバーと接続を確立しようとしている
Connect サーバーと接続が確立した
Disconnect サーバーとの接続を閉じた
QueryTimeout SQLの実行時間がQueryTimeを超えた
QueryCompleted SQLの結果として1件目が取得できた
WillExecute SQLを実行しようとしている
rdoResultset Associate 結果セットが新しいrdoConnectionに関連付けられた
Disociate 結果セットがrdoConnectionから切り離された
ResultsChanged 新しい結果セットが使えるようになった
RowCurnncyChange カレント行が移動した
RowStatusChange カレント行のデータの状態が変化しました
WillAssociate 結果セットを新しいrdoConnectionに関連付けようとしている
WillDissociate rdoConnectionから接続が切り離されようとしている
WillUpDateRows データベースへの更新が発生しようとしている

そして、イベントを付加すれば、メソッドの終了を調べるのにStillConnectプロパティやStillExecuteプロパティの値を定期的に確認する必要がありません(リスト4図9

RDO2.0の新機能―ユーザーコネクションデザイナ―

ユーザーコネクションデザイナは、デザイン時にrdoConnectionオブジェクトとrdoQueryオブジェクトに対して実際にデータベースと接続してプロパティを設定できます(図10)。

図10 ユーザーコネクションデザイナ

ユーザーコネクションデザイナのデザイン結果は、プログラムからは、新しいオブジェクトとして扱えます。そのため、クラスモジュールのように新しいプロパティやメソッドなども追加できるので、クライアント側で記述するストアドプロシージャのように使えます(
リスト5)。

RDO2.0の活用−RDO2.0をOracleで使ってみる−

Visual Basic 5.0には、Microsoft SQL Server ODBCドライバの他にMicrosoft Oracle ODBCドライバ(執筆時点でのバージョンは2.00.006325)が添付されています(SQL*Net Client 2.3必須、2.2だとエラーが発生して接続できませんでした)。このドライバでRDO2.0の新機能を使った結果を報告します。なお、動作確認は、該当する機能のSQL Serverのサンプルのデータソース名、ユーザー名、パスワードおよびテーブル名の変更のみで評価しています。もしかしたら、Oracle用の特別な設定を行えば動作する可能性があるかもしれません。

このことから、RDO2.0と共に提供されるOracle用ODBCドライバを使ってもすべての機能が正常動作しないことが判りました。しかも、レコード移動の性能測定の結果も余り良くありません(図14・15)。ODBCの出来がRDOの機能や性能に大きく影響していることが判ります。

図14 RDO2.0/Oracleベンチマーク

図15 カーソル別/レコード件数別移動時間グラフ

また、今回のサンプルでは、ほとんどプログラムソースを変更せずに動作しましたが、これは単純なSQL文で確認したからです。ODBCが統一するのは、あくまでプログラムインターフェイスであることに注意してください。
そのインターフェイス上を流れるSQL文までが各RDBMSに依存しない訳ではありません。そして、SQL ServerとOracle7が同じSQLで動作するのは、今回のような基本的な部分であり、ストアドプロシージャなどはまったく別物です。ですから、RDOを使ってSQL ServerとOracle7の両方で稼動する業務アプリケーションを設計するときは、各RDBMSの性能を充分引き出せないことを覚悟しておく必要があります。
結局は、RDBMSを使うときは、そのRDBMSの癖や機能のノウハウを持っているか否かがプロジェクト成功のキーポイントになります。


テスト環境
Server:FMV5200T5(32MB)
NT4.0Server(SP2)+SQL Server6.5
Server:FMV5133T4(32MB)
 NT3.51Server(SP5)+Oracle7ServerR7.1
Client:FMV5200T5(64MB)
 NT4.0Workstation(SP2)

Visual Basic 開発者の手引き | Visual Basicコースホームページ
int21 ホームページ | PCDN ホームページ



Copyright (c) 1997 Toshikazu Fukuoka All Rights Reserved.
For questions or comments, please send mail to: pcdn@int21.co.jp