110 likes | 228 Views
アプリケーション依存の先読みが可能な O/R マッピングツール. 理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 01_0017_3 青木康博. O/R マッピングフレームワーク. オブジェクト指向プログラムと RDB のインピーダンスミスマッチを解消 マッピング作業を自動化 DB データの更新・取得 トランザクション、例外処理、 DB 接続 SQL は不要!!. EJB CMP, JDO, Hibernate, Cayenne, etc. インピーダンス・ミスマッチ. オブジェクト ( リレーショナルテーブルをフィールドに保持 ). テーブル.
E N D
アプリケーション依存の先読みが可能なO/Rマッピングツールアプリケーション依存の先読みが可能なO/Rマッピングツール 理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 01_0017_3 青木康博
O/Rマッピングフレームワーク • オブジェクト指向プログラムとRDBのインピーダンスミスマッチを解消 • マッピング作業を自動化 • DBデータの更新・取得 • トランザクション、例外処理、DB接続 • SQLは不要!! EJB CMP, JDO, Hibernate, Cayenne, etc... インピーダンス・ミスマッチ オブジェクト (リレーショナルテーブルをフィールドに保持) テーブル
既存O/Rマッピングは非効率 • 既存フレームワークはマッピングが固定 • すべてのリレーショナルテーブルを一括取得=先読み • 手動で一部を遅延可能(XML記述で指定) • 固定的なマッピングの問題 • 無駄な先読みデータが計算機資源を浪費 • 遅延を濫用するとDBアクセスが頻発 • 効率ならSQLを駆使して手動で直書き? • コード散在、保守性、拡張性の低下 トレードオフ 文脈に応じて的確に先読みしたい
本研究で開発:文脈に応じた 先読みが可能なフレームワーク本研究で開発:文脈に応じた 先読みが可能なフレームワーク • 開発したフレームワーク • O/Rマッピングはすべてオンデマンド • テーブルだけでなくプロパティも • 既存のCayenneフレームワークを改造 • 文脈に応じて細やかに部分的先読み • AspectJのライブラリを開発 • XPathに基づき先読みのタイミングとデータを直感的に指定 コード合成 (weave) 先読み記述 (AspectJプログラム) アプリケーション マッピング フレームワーク DB オブジェクト 透過的な永続化 テーブル
Paper ・ paperid(PK) ・ title ・ psfile Cayenneの改造 • 先読み機能に適したフレームワーク • 細粒度なマッピング(プロパティ単位) • リレーショナルテーブルはそのプライマリキーのみ取得 • 別々に取得したプロパティからオブジェクトを構築 • データへのアクセス経路を記録 • 先読みの指定に必要 • マッピングに必要 DB paperid title psfile paper
先読みを支援するAspectJライブラリ • AspectJライブラリを利用して先読み記述 • モジュール的に独立 • 文脈に基づいてプログラマブルに記述可能 • DBアクセスに基づいた先読みの指定 • XPathでデータを指定できるライブラリ • 先読みタイミング • 先読みデータ 細やかな先読みでも煩雑なSQLは不要
Proceeding Paper Paper Paper ・psfile ・title ・psfile ・title ・psfile ・title 先読みアスペクトの記述例 public aspect PolicyAspect { after(Paper p) : load() && this(p)[//Proceeidng/Paper/@*]{ prefetch(p, “../Paper/@psfile”); } } マッピングのタイミングの指定 取得データの指定 • XPathによる先読みのタイミングの指定 • XPathによる取得データの指定 • ⇒ 直感的かつ容易に指定が可能 先読みの実行
after(Paper paper) : load() && this(paper)[//Author/Paper/@*] { int i = getInt(“../authorid”); if(i == id) prefetch(paper, “../Paper/@*"); else prefetch(paper, “./@*"); id = i; } after(Paper paper) : load() && this(paper)[//Paper/@*] { int min = 0; while(min + 100 <= getInt(“../@paperid) min += 100; prefetch(paper, "//Paper[@paperid >= " + min + “ and @paperid < ” + (min + 100) + “]/@*"); 時間・DBアクセス・メモリ量の比較実験 一部の リレーション 一部の行 一部の列 実行時間(s) メモリ使用量(MB) ・DBサーバ: Linux 2.6.7, P4 Xeon 3.06G, 2GB, PostgreSQL 7.4.2 ・クライアント: WinXP, P4 2.8G, 1GB ・LAN:1000BaseTX メモリを浪費 テーブル 単位 プロパティ 単位 本フレーム ワーク 本フレーム ワーク テーブル 単位 プロパティ 単位 DBアクセス回数 after(Paper paper) : load() && this(paper) [//Paper/@*] { prefetch(paper,“//Paper/@*[self::titleand self::psfile]"); } テーブル 単位 1 1 100 DBアクセスが頻発 文脈に応じた適切な先読み => 実行時間・メモリ量の効率化 プロパティ 単位 2,000 1,500 564 本フレーム ワーク 3 11 174
関連技術 • CMP Entity Bean • EJBの機能の一部 • EJBコンテナがSQLを自動管理 • SQLの発行のタイミングや先読みなどの指定が出来ない • Hibernate • 柔軟性の高いマッピングをサポート • HQLによるアクセスが可能 • アプリケーションの文脈依存の先読みをサポートしていない
まとめと今後の課題 • アプリケーション依存の先読みが可能なO/Rマッピングフレームワーク • 先読み記述をアスペクトとして記述 • 文脈に応じた細かな先読みが可能 • 簡単な実験によって有効性を確認 • 今後の課題 • 現実的なアプリケーションでの実験 • 言語拡張の実装 • より細かなタイミングの指定 • アプリケーション単位でのキャッシュのポリシーの指定
Journal Paper Proceeding Person RDBアクセスに基づいた先読み journal paper 先読み getPapers() proceeding getMembers() getAuthor() 先読み Person