アプリケーション依存の先読みが可能なO/Rマッピング

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