アスペクト指向を 利用した永続オブジェクト・アクセ

アスペクト指向を利用した永続
オブジェクト・アクセスの高速化
東京工業大学 千葉研究室
青木 康博
千葉 滋
佐藤 芳樹(現 三菱総研)
1
リレーショナルデーベース(RDB)
を用いた永続化

永続システム
永続化したいクラスと DB テーブルとを対応づ
けるルールを記述
DB アクセスは永続オブジェクトのリファレンスを
辿る際に透過的に行われる


全てのデータをオブ
ジェクトとして扱う
CMP Entity
Bean など
Animal
Cat
Dog
オブジェクト指向
•データ間の関係
永続システム
•データ構造の表し方
•継承やポリモノフィズム
全てのデータは
テーブルに格納
タマ
猫
タロウ 犬
インピーダンス・ミスマッチ
効率のよい開発
RDB
2
最適化の必要性

必要最小限なデータだけを取得したい

安易なデータ取得は、RDB との通信の
オーバーヘッドや大量のメモリ消費を引き
起こす
千円以上の商品の情報がほしい
RDB 特有の機能である where 句や
join 句を利用して最適化を行いたい
オブジェクト
千円~
オブジェクト
の商品
オブジェクト
を利用
オブジェクト
アプリケーション
id price
1 800
2 1,000
3
4
500
1,500
商品の情報が格納されたテーブル
3
最適化の必要性

必要最小限なデータだけを取得したい

安易なデータ取得は、RDB との通信の
オーバーヘッドや大量のメモリ消費を引き
起こす
千円以上の商品の情報がほしい
必要なデータのみ
を取得
RDB 特有の機能である where 句や
join 句を利用して最適化を行いたい
オブジェクト
オブジェクト
アプリケーション
id price
1 800
2 1,000
3 500
4 1,500
商品の情報が格納されたテーブル
4
永続システム:AspectualStore

アスペクト指向の利用

外部ファイルで最適化のヒントを与える



アプリケーションのコードを書き換える必要なし
最適化の指示が局所化
DB からのデータ取得を最適化

チューニングが最も必要となるのは永続オブジェ
クトのコレクションを取得する場合
5
チューニングが必要な例:
文献検索システム
不必要なデータ取得
PK title
Proceeding proc = …;
List l = proc.getPapers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
Author a = p.getAuthor();
/* Paper のタイトルと
Author の名前を表示 */
}
Paper
Procdng
Paper
Paper
DB アクセス
Paper の取得
paper
テーブル
DB アクセス
author
テーブル
Author の取得
PK name
Author
Author
for文が回る度毎のSQL発行
効率の悪いDB アクセス
Author
一括して Paper.title と Author.name のみを取得したい
6
AspectualStore での最適化
Paper.title と
Author.nameを
同時に取得せよ
アスペクト記述
永続オブジェクトが
取得するデータの指示
PK title
Proceeding proc = …;
List l = proc.getPapers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
Author a = p.getAuthor();
/* Paper のタイトルと
Author の名前を表示 */
}
Procdng
DB アクセス
Paper の取得
paper と author を
join
DB アクセス
paper
テーブル
author
テーブル
Author の取得
Paper
Paper
Paper
Author
PK name
Author
Author
アプリケーションのコードを書き換える必要がない
7
記述例:
join によるデータ取得
• pointcut:
showPaperList(Proceeding)
メソッドが呼ばれた際
• advice:
引数の Proceeding オブジェクト
の getPaper() は、Paper.title と
Author.name を join によって取得
showPaperList メソッド
…
Proceeding p = …;
p.getPapers();
…
before(Proceeding p) :
execution(void showPaperList(..)) &&
args(p) &&
…{
p.join(“papers”,
“./Paper/@title”,
“./Paper/Author/@name”);
}
SQL の発行
SELECT p.title, a.name … INNER JOIN …
AspectualStore
オブジェクトの生成
Paper
Paper
Paper
Author
Author
Author
DB
8
記述例(AspectJ を利用)
pointcut :
指示を出すタイミング
advice :
取得データの指示

before(Proceeding p) :
execution(void showPpaerList(..) &&
args(p) && … {
p.join(“papers”,
XPath
“./Paper/@title”,
“./Paper/Author/@name”);
}
XPath による取得データの指定



pointcut された永続オブジェクト = current node
@属性 => 取得するフィールド
[条件] => 取得するオブジェクトの選択
9
AspectualStore のアスペクト内
で利用可能なライブラリ

タイミング指定用の pointcut

loadProperty()


loadRelationship()


永続オブジェクトのリファレンスを辿る時点
取得データ指定用のメソッド(アドバイス内で利用)

add(..), join(..)



getter が DB から取得するデータを追加
fetch(..)

指定されたデータを DB から取得
access(..)


フィールドをロードする時点
AspectulStor
eの内部構造
を知る必要な
し
getter がどのようなオブジェクトを参照するのかを判定
指定には XPath を利用
10
アスペクトは最適化のヒント

アスペクト記述によってアプリケーショ
ンの挙動は変わることはない
Paper.title と
Author.nameを
同時に取得せよ
Proceeding proc = …;
List l = proc.getPapers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
…
}
Paper p = (paper)l.get(10);
String ov= p.getOverview();
…
アスペクト記述
Paper.title と
Author.name を取得
DB
改めて DB にアクセスし、
Paper.overview を取得
11
AspectualStore の実装

アスペクト記述の言語処理部


AspectJ を利用
永続システム


O/R マッピングフレームワークである Cayenne の永
続システム部を基に開発
テーブルレコードのプロパティ単位の取得




永続オブジェクト生成時には主キーのみを DB から取
得
フィールドにアクセスがあった時点で改めて DB アクセ
スし、プロパティを取得
getter が取得するデータを変更する機能を永続オブ
ジェクトに追加
DB から取得したデータを適切なオブジェクトに結びつ
12
けるための機構
O/R マッピングフレームワークに
よる最適化(従来技術)
List l = s.find(“select Paper.title, Author.name…” +
“inner join …” +
“where … ” );
PK title
Proceeding proc = …;
DB アクセス
List l = proc.getPapers();
Paper の取得
for(int i = 0; I < l.size(); i++) {
paper と author を
Paper p = (Paper)l.get(i);
join
DB アクセス
Author a = p.getAuthor();
/* Paper のタイトルと
Author の取得
Object[] row = l.get(i);
Author の名前を表示 */
Strg title = (Strg)row[0];
PK name
}
Strg name = (Strg)row[1];
title
title
name
name
title
name
アプリケーションのコードを大幅に書き換える必要
paper
テーブル
author
テーブル
13
O/R マッピングフレームワーク
の問題点

SQL 直書きで必要なデータを選択可能


クエリ言語を用いて直接的に永続オブジェクトを取
得する方法を用意
Session s = ..;
s.find(“SELECT … WHERE price > 1000”);
…
プログラミングが煩雑

チューニングの度にSQL を埋め込む



SQL に合わせてアプリケーションの変更が必要
モジュラリティの低下
DAO の利用(SQL を一箇所にまとめる)



DAO への新たなメソッドの追加
追加したメソッドを利用するようアプリケーションの書き
換え
14
SQL に合わせたアプリケーションの変更
実験
サーバ:P4 Xeon 3.06G, 2GB,
PostgreSQL 7.4.2
DBサーバ:Linux 2.6.7
アプリケーションサーバ:Solaris 9
Tomacat 4.1, Java 1.4.1
LAN 1000 BaseTX
文献検索システム
実験内容
1.
2.
3.
4.
Proceeding、Article、
Journal のリストを表示し、
Proceeding を選択
Proceeding の名前の一覧
(10 件ずつ) を表示し、一つ
を選択
Proceeding の内容、発表さ
れたPaper のタイトル・著者
名の一覧を表示し、一つを
選択
Paper の内容を表示
Bibliography
DB から10 件づつ
proceedings
Proceeding オブジェクトの
articles
name フィールドを取得
journals
Proceeding
Article
nameオ
join 句によって
Paper
title
startPage
ブジェクトと
Authoryear
オブ
papers
endPage一括取得
ジェクトを
Author
Paper
title
name
Paper
オブジェクトの
author
papers
title…以外のフィールドを
overview
取得
pdffile
psfile
Journal
name
publisher
…
Publisher
name
adress
…
15
実験(cont’d)

結果
システム
永続システム
実行時間(秒) DB アクセス(回)
0.79倍
O/R Mapping Framework
AspectualStore

1.39
1.48
0.73倍
13
4
約半数
5
アプリケーションのコードを変更しない




1.90
PK (主キー) を取得
永続オブジェクトを生成
取得データを適切なオブジェクトへ結合
予備的な実
験において
は、、
O/R マッピングフレームワークに近い最適
化が実現できる
16
関連研究

永続システムの最適化技術

O/R Mapping frameworks


ObjectStore[ Progress Software Corp.]


オブジェクト指向データベース
PJama [Atkinson, ’96]


Cayenne, Hibernate, Torque…
Java 言語を拡張し、オブジェクトに対する柔軟性の
高い永続化を実現
μDyner [Marc, ’03]

アスペクト指向を利用した Web キャッシュの動的な
先読み
17
まとめ

永続システム AspectualStore の提案・開発



アプリケーションコードを書き換えることなく最適化
が可能
プロパティ単位の細やかなデータ取得が可能
現在の状況


言語処理部: AsepctJ を利用
永続システム: O/R マッピングフレームワーク
Cayenne を基に開発
18
今後の課題

取得データの指示の簡潔化



AspectJ では、指示が簡単とは言い難い
より簡潔な記述言語の検討
より柔軟な永続クラス


各永続フィールド毎の getter、setter が必要
より柔軟な永続オブジェクトの定義が可能となるよう
に検討
19
終わり
ありがとうございました。
20
AspectualStore の特徴

アスペクト指向を利用した、永続オブジェクトが
DB から取得するデータの指示



アプリケーションコードの変更の必要なし
最適化の指示が局所化
プロパティ単位の細やかなデータ取得


永続オブジェクト生成の際には、主キー(PK)と指示の
あったプロパティのみを取得
指示のなかったプロパティは必要になった時点で取得
システムのチューニングが容易
21
AspectualStore の概要

Servlet
…
アプリケーションの本体コードを変更するこ
となく AOPXML
でチューニングが可能な永続シ
オブジェクトと
ファイル
DB テーブルと
ステム
Contrl
の対応付け
…
Bibgrphy
…
AspectualStore
永続システム
Author
…
Paper
…
永続オブジェクト
アプリケーション
paper
author
アスペクト記述
永続オブジェクトの
getter が取得する
データの指示
データベース
22
O/R マッピングフレームワークで
の最適化
Proceeding proc = …;
List l = DAO.getPaperTitle(proc);
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
String title = p.getTitle();
/* title を表示 */
}
Proceeding proc = …;
List l = DAO.getPaperWithAuthor(proc);
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
if(paper.getJenre().equals(“AOP”) {
Author a = paper.getAuthor();
/* auhtor の情報を表示 */
}}
DAO
…
List getPaperTitle(..)
List getPaperWithAuthor(..)
…
1. DAO に新たなメソッドを追加
2. アプリケーションのコードを追加
したメソッドを利用するように書
き換える
23
AspectualStore での最適化
Proceeding proc = …;
List l = proc.getPpaers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
String title = p.getTitle();
/* title を表示 */
}
指示
Aspect
永続オブジェクトが
取得するデータの指示
PK title
指示
Proceeding proc = …;
List l = proc.getPpaers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
if(paper.getJenre().equals(“AOP”) {
Author a = paper.getAuthor();
/* auhtor の情報を表示 */
}}
DB アクセス
DB アクセス
PK name
外部キー
24
チューニングが必要な例:
文献検索システム
チューニングが最も必要となるのは永続オブジェクトのコレク
ションを取得する場合
Proceeding proc
= …;
PK title

List l = proc.getPpaers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
String title = p.getTitle();
/* title を表示 */
}
DB アクセス
paper
テーブル
title フィールドのみ
を取得
不必要なデータ取得を防ぐ
PK title
Proceeding proc = …;
List l = proc.getPpaers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
/* ジャンルが AOP である p
の auhtor の情報を表示 */
}
DB アクセス
paper と author を
join
DB アクセスの頻発を防ぐ
genre
paper
テーブル
PK name
author
25
テーブル
チューニングが必要な例:
文献検索システム


チューニングが最も必要となるのは永
続オブジェクトのコレクションを取得す
る場合
Aspect
永続オブジェクトが
例えば
取得するデータの指示
指示
Proceeding proc = …;
List l = proc.getPapers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
String title = p.getTitle();
/* title を表示 */
}
DB アクセス
PK title
title フィールドのみ
を取得
不必要なデータ取得を防ぐ
paper
テーブル
26
チューニングが必要な例(cont’d)
• AOP に関する Paper に対してのみ全てのフィールドを取得
• paper テーブルと author テーブルとを join
Aspect
指示
Proceeding proc = …;
List l = proc.getPapers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
Author a = p.getAuthor();
/* ジャンルが AOP である p
の auhtor の情報を表示 */
}
永続オブジェクトが
取得するデータの指示
PK title
DB アクセス
paper と author を
join
paper
テーブル
PK name
author
テーブル
DB アクセスの頻発を防ぐ
27
チューニングが必要な例:
文献検索システム


チューニングが最も必要となるのは永
続オブジェクトのコレクションを取得す
る場合
Aspect
永続オブジェクトが
例えば
取得するデータの指示
指示
Proceeding proc = …;
List l = proc.getPapers();
for(int i = 0; I < l.size(); i++) {
Paper p = (Paper)l.get(i);
String title = p.getTitle();
/* title を表示 */
}
DB アクセス
PK title
title フィールドのみ
を取得
不必要なデータ取得を防ぐ
paper
テーブル
28
記述例(1):
join によるデータ取得
• pointcut:指示を出すタイミング
showPaperList(Proceeding)
メソッドが呼ばれた際
• advice:取得データの指示
引数の Proceeding オブジェクト
の getPaper() は、Paper の title
フィールドと Author の name
フィールドを join によって取得
…
Proceeding p = …;
p.getPapers();
…
before(Proceeding p) :
execution(void showPaperList(..)) &&
args(p) &&
…{
p.join(“papers”,
“./Paper/@title”,
“./Paper/Author/@name”);
}
SELECT p.*, a.* FROM paper AS p INNER JOIN
author AS a ON p.authorid = a.authorid
WHERE p.proceedingid = 10;
Paper オブジェクト、
Author オブジェクトの生成
DB
29
記述例(2):
where によるデータ取得
• pointcut:指示を出すタイミング
Proceeding オブジェクトの
getPaper() メソッドが呼ばれた際
• advice:取得データの指示
ジャンルが AOP である Paper
オブジェクトの title フィールドに
対するデータを取得
…
Proceeding p = …;
p.getPapers();
…
void around(Proceeding p) :
this(p) &&
loadRelationship() &&
if(access(thisJoinPoint, “Paper”) &&
…{
fetch(p, “./Paper[@jenre=AOP]/@title”);
}
SELECT p.paperid, p.title FROM paper
AS p WHERE p.proceedingid = 10 and
p.Jenre = AOP
Paper オブジェクトの生成
DB
30
AspectualStore の実装

AspectualStore 本体の実現方法




テーブルレコードのプロパティ毎の取得
永続オブジェクト生成時には PK のみを取得
データ取得の指示を出すための API を用意
取得データの指定方法には、プロトタイプとして
AspectJ を利用


pointcut:取得データを指定するタイミングを決定
advice :取得するデータの指示
31
記述例:
join によるデータ取得(AspectJ)
• pointcut:指示を出すタイミング
showPaperList(Proceeding)
メソッドが呼ばれた際
• advice:取得データの指示
引数の Proceeding オブジェクト
の getPaper() は、Paper.title と
Author.name を join によって取得
before(Proceeding p) :
execution(void showPaperList(..)) &&
args(p) &&
…{
p.join(“papers”,
“./Paper/@title”,
“./Paper/Author/@name”);
}
SQL の発行
SELECT p.title, a.name … INNER JOIN …
…
Proceeding p = …;
p.getPapers();
…
AspectualStore
オブジェクトの生成
Paper
Paper
Paper
Author
Author
Author
DB
32