CData Driver アーキテクチャに関するブログ記事シリーズのパート 3 です。このシリーズのパート 2(複数テクノロジーのサポート)で触れたとおり、コアコードベースにはプロバイダー実装に提供されるさまざまなサービスがあります。各プロバイダーが使用する汎用的なサービスもあれば、特定のクラスのプロバイダーの実装を簡素化するものもあります。
この記事では、ドライバーサービスに焦点を当てていきます。

メタデータキャッシング
メタデータは、あらゆるデータアクセスドライバーにとって重要な要素です。すべてのプロバイダー実装は、次のような基本的なメタデータ操作をサポートする必要があります:
メタデータに関する課題については以前の記事でも取り上げましたが、特によくある課題のひとつは、多くの技術においてデータソースからメタデータを取得するコストが非常に高いことです。
CData 製品のメタデータレイヤーは、すべてのドライバーが共通のフォーマット(必要に応じて拡張も可能)でメタデータを提供しつつ、取得済みのメタデータを透過的にキャッシュすることでパフォーマンスを大幅に向上させる設計になっています。
デフォルトでは、メタデータはメモリ上にキャッシュされ定期的にリフレッシュされますが、メタデータキャッシングサービスは Derby や SQLite データベースなどの外部リポジトリにキャッシュすることもできます。
インメモリメタデータキャッシングの実装で直面した課題のひとつが、大規模で複雑なデータモデルを持つデータソースへの対応です。内部メタデータキャッシュとメタデータ検出プロセスの最適化は、引き続き優先事項となっています。
SQL 正規化
SQL 正規化エンジンは、CData Driver モデルにおけるもうひとつの重要なコンポーネントです。プロバイダーが SQL クエリを受け取ると、通常、実行前にクエリに対して一連の正規化ルールを適用します。
SQL 正規化とは?
SQL 正規化ルールとは、クエリの意味を保ったまま行う、クエリの抽象構文木(AST)の変換です。クエリの構造についていくつかの前提を置くことで解釈しやすくなり、ドライバーの実装を簡素化できます。
なぜこれが重要なのでしょうか? 主要なビジネスインテリジェンスツールやアナリティクスツールをすべてサポートするには、ドライバーが多様なクエリ機能に対応しなければなりません。こうしたツールは内部ルールに基づいて SQL ステートメントを自動生成します。一見すると非常に複雑に見えるクエリも、実はシンプルな概念を表現しているだけ、ということがよくあります。たとえば、ネストされた SELECT ステートメントが生成されたとしても、それを単一の SELECT に簡素化できるケースがあります。
現在、20 種類以上の共通正規化ルール(さらにプロバイダー固有のルールも)があるため、ここですべてを取り上げることはしません。ただし、イメージをつかんでいただくためにいくつかの例をご紹介します。
まず簡単な正規化の例として、WHERE 句のカラム参照があります。クエリに "... WHERE 5000 < revenue" のような記述が含まれている場合、カラム参照が常に式の左側に来るよう正規化できます:"... WHERE revenue > 5000"
より興味深い例として、条件の最小化があります。レポーティングツールは、WHERE 句に"... AND (1=1)"を追加するといったテクニックをよく使います。これは常に true を返すため、適切な条件がそろっていればクエリから安全に除去でき、プロバイダー固有のコードで対処する必要がなくなります。
構築するプロバイダーごとに、クエリ処理時に自動適用する正規化ルールの適切なセットを選択しています。プロバイダーによっては、データソース固有のクエリ機能を活用してクエリをより正確に、またはより高速に実行するための追加変換も行います。
OData サポート
CData Driver の多くは、OData エンドポイントを公開するデータソース向けです。汎用的なドライバーも用意しています。そのため、標準仕様に基づく追加ドライバーの開発を効率化できる、再利用可能なコア OData 実装を構築しました。
この共有コンポーネントは、次のようなタスクを処理します:
OData サービスおよびメタデータドキュメントの読み取りと解釈
OData データ操作(クエリとデータ変更の両方)のコア実装
ATOM および JSON(JavaScript Object Notation)フォーマットのサポート、OData バージョン間の差異への対応
ほとんどの OData ベースのドライバーでは、この共有コンポーネントをプロバイダー実装から直接呼び出しています。
その他のサービス
ドライバーコアには、アーキテクチャ図に示されていないものも含め、次のようなサービスがあります:
接続のオープン / クローズのコストを削減するコネクションプール実装
バルクデータ更新をサポートする Bulk Row Manager
テーブルのデータ行をスキャンしてカラムメタデータを動的に検出する RowScan(共有実装)
内部フレームワークで作成されたドライバー向けに、結果セットをページ単位で取得する Page Providers
シリアルフェッチとパラレルフェッチの両方に対応し、パフォーマンスを向上させる Parallel Fetch
まとめ
シリーズの第 3 回では、新しいドライバーの開発を簡素化するためにドライバーコードに実装されたサービスについて解説しました。
次の記事では、コアドライバーモデルとクエリの実行の仕組みについて見ていきます。
※本記事はCData US ブログ CData Architecture: Core Driver Services の翻訳です。