DataDirect Connect for ADO.NET

先日の日記ではADO.NETにおけるOracle用プロバイダの傾向について書いたが、これらは全てSQL*NET環境が前提で動作するプロバイダだった。
Javaのデータベース接続規格であるJDBCはそのドライバのタイプに"ネイティブ・プロトコル・ドライバ"もしくは"Type 4 Thin Driver"と呼ばれる、ミドルウェアの助けを必要としないドライバがあるが、これは全てJavaで書かれているためDLL等の共有ライブラリィに特有の問題が発生せず、プラットホームと共に性能がスケールし易く使い勝手も良いものだ。
Oracleの場合はOCI層を省略できるので性能の向上が期待できるし、なによりあの扱い難いOracleインストーラとTNSクライアントをインストールしなくても良いので、私はこのタイプのドライバしか使わない。
.NET ADO.NETデータプロバイダも"Thin Driver"のように真のマネジドなデータプロバイダは無いものかと調べていたのだが、商用のソフトウェアとして世に出ているのを見つけた。

DataDirect Connect for ADO.NET - DataDirect Technologies
DataDirect Connect for ADO.NET 3.0 - データディレクトテクノロジーズ

DataDirect Technologies(データディレクトテクノロジーズ日本法人)は元々JDBCドライバ(DataDirect Connect for JDBC)やODBCドライバ(DataDirect Connect for ODBC)を提供するミドルウェアベンダとして著名である。
DataDirect Connect for ADO.NET 3.0は謳い文句にもあるようにデータベースベンダー固有のミドルウェアを一切必要としない、100%マネジドコードのADO.NETデータプロバイダである。(ADO.NETデータプロバイダというからには、本来こうあって欲しいものだ)
著名なデータベース(Oracle, DB2, SQLServer, Sybase)をサポートする等、機能の詳細はリンクから辿って見るとして、Oracle版に限って言えば面白いのは最初に書いたとおりSQL*Netを一切使わないでOracleに接続することが出来る他に、他のプロバイダ同様にSQL*Net TCP/IPリスナつまりtnsname.oraに記述された情報を元に接続することもできることだ(後述するが、これが嵌る元なのだが)

DataDirect Connect for ADO.NET 3.0は商用のコンポーネントだが15日間の試用期間であればフルに使うことができる。早速インストールして使ってみようとしたのだがインストール途中で以下のメッセージが表示されて止まってしまう。

サポート情報を調べてみると試用版は複数のCPUを持つPC用(仕事に使用しているPCはIntel Xeon 2Ghzを二基搭載している)としては提供されていないようでこのままではインストールできない。

Unable to install Cf.NET 3.0 as eval on a 2CPU machine.

この情報を見ると制限を解除するためのパッチが既にリリースされているように見えるのだが、日本語のサイトからは同様の情報は無いようだ。はてと思いDataDirect Connectのアップデートのページを見てみると、項目は違うが最新のファイルがアップされているのを見つけることができた。

Windows Vista対応パッチ- Connect for ADO.NET 3.0
- Connect for ADO.NET 3.0 Windows Vista 対応パッチ(Release 3.0, Service Pack 4 (0014))

このパッチ、Windows Vista用とあるがそのreadmeを見てみると

     DataDirect Connect(R) for ADO.NET
     Release 3.0, Service Pack 4 (0014)
     January 2007

とあり、今までのFixが全て含まれているファイルのようだ。これをダウンロードして(ダウンロードするにはユーザ登録を行う必要がある)インストールしてみると上のような警告が出ることはなくなった。

インストール(ngenが実行されてアセンブリはGACに登録される)が完了した後、性能最適化のためのウィザードがActiveXを配したHTML上で実行される。

試用するだけであれば、デフォルトを受け入れればよいだろう。


さて、インストールも成功したので先日行ったのと同様のコードで性能の傾向を計測してみようと、最初のプロバイダの選択部分を追加することにした。

#if   ODPNET
 DbConnection con = new Oracle.DataAccess.Client.OracleConnection();
 con.ConnectionString = "User Id=KAZZZ;Password=KAZZZ;Data Source=ORCL;";
#elif MSORACLE
 DbConnection con = new System.Data.OracleClient.OracleConnection();
 con.ConnectionString = "User Id=KAZZZ;Password=KAZZZ;Server=ORCL;"; 
#elif OLEDB
 DbConnection con = new System.Data.OleDb.OleDbConnection();
 con.ConnectionString = "Provider=MSDAORA.1;User ID=KAZZZ;password=KAZZZ;Data Source=ORCL;Persist Security Info=False";
#elif DDTek
 DbConnection con = new DDTek.Oracle.OracleConnection();
 con.ConnectionString = "Host=hostname;Port=1521;User ID=KAZZZ;Password=KAZZZ;Service Name=ORCL";
#endif

接続文字列を見ると、他のプロバイダと違いOracleがインストールされているサーバに直接接続するための情報(ホスト名、ポート番号)が記述されているのが判るだろう。これはJDBC Oracle Thin Driverと同様の記述だ。
さて、これでDataDirect Connect for ADO.NET 3.0による接続も上手く行くと思ったのだが、そうはいかなかった。上記の接続文字列はドキュメントに書かれていたサンプルを参考にしたものだが、この通りに書くとOracle固有のエラーが戻るのである。

[12514] TNS-12513 TNS:service handler found but it has registered for a different protocol

何度も書いているがDataDirect ConnectはSQL*Netを必要としないはずだ。なのに何故TNSを使おうとしてそのエラーが出るのだろう。技術情報を見ても判らなかったので、DDETek.OracleConnectionクラスのプロパティを調べた所、接続文字列として記述したServiceNameプロパティの他にSIDプロパティがあるのに気が付いた。SIDはOracleに詳しい方であればご存知の通り、Oracleのグローバルなデータベースインスタンスを表すIDであり、JDBC Thin Driverではこいつを指定することで任意のOracleデータベースに接続する。なので、接続文字列を以下のように変えた所問題無く接続ができるようになった。(結局、この場合の"Sevice Name"には何を指定すれば良かったのだろう。)

 DbConnection con = new DDTek.Oracle.OracleConnection();
 con.ConnectionString = "Host=hostname;Port=1521;User ID=KAZZZ;Password=KAZZZ;SID=ORCL";

さて、これで先日使ったサンプルコードが動くようになったので早速実行してみる。比較のために先日計測した中でODP.NETの結果を合わせて載せておく。

接続に要した時間 = 115.9165ミリ秒、 3000件のレコード読み込みに要した時間 1487.1256ミリ秒 
接続に要した時間 = 0.0667ミリ秒、 3000件のレコード読み込みに要した時間 1549.3851ミリ秒 
接続に要した時間 = 0.0548ミリ秒、 3000件のレコード読み込みに要した時間 1560.7527ミリ秒 
接続に要した時間 = 244.1747ミリ秒、 3000件のレコード読み込みに要した時間 1715.2763ミリ秒 
接続に要した時間 = 8.8628ミリ秒、 3000件のレコード読み込みに要した時間 1642.5261ミリ秒 
接続に要した時間 = 0.1758ミリ秒、 3000件のレコード読み込みに要した時間 1587.5216ミリ秒 

ODP.NETに比べて抜群とまでは言えないが、接続/読込み共に良い性能だ。
なによりこのプロバイダは他のミドルウェアの助けを一切必要としない真の.NETマネジドプロバイダなのであり、それだけで存在価値があると思われる。
1クライアントライセンスは日本法人経由で11000円(+必要な場合の保守費用)必要だが、自分達で同様のものを開発する費用を考えると安いものだろう。

※※なお、このテスト結果は私個人が参考するための個人的且つ限定的な使用環境における性能の傾向であり、ADO.NETプロバイダにおける厳密な性能比較を表したベンチマークではないことをお断りしておく※※