Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "アスペクト指向を利用した永続オブジェクト・アクセスの高速化"— Presentation transcript:

1 アスペクト指向を利用した永続オブジェクト・アクセスの高速化
東京工業大学 千葉研究室 青木 康博 千葉 滋 佐藤 芳樹(現 三菱総研)

2 リレーショナルデーベース(RDB) を用いた永続化
CMP Entity Bean など 永続システム 永続化したいクラスと DB テーブルとを対応づけるルールを記述 DB アクセスは永続オブジェクトのリファレンスを辿る際に透過的に行われる 全てのデータは テーブルに格納 全てのデータをオブ ジェクトとして扱う データ間の関係 データ構造の表し方 継承やポリモノフィズム 永続システム タマ タロウ インピーダンス・ミスマッチ オブジェクト指向 RDB 効率のよい開発

3 最適化の必要性 必要最小限なデータだけを取得したい 安易なデータ取得は、RDB との通信のオーバーヘッドや大量のメモリ消費を引き起こす
千円以上の商品の情報がほしい RDB 特有の機能である where 句や join 句を利用して最適化を行いたい id price 千円~   の商品     を利用 オブジェクト 1 800 オブジェクト 2 1,000 オブジェクト 3 500 オブジェクト 4 1,500 アプリケーション 商品の情報が格納されたテーブル

4 最適化の必要性 必要最小限なデータだけを取得したい 安易なデータ取得は、RDB との通信のオーバーヘッドや大量のメモリ消費を引き起こす
千円以上の商品の情報がほしい RDB 特有の機能である where 句や join 句を利用して最適化を行いたい 必要なデータのみ を取得 id price 1 800 オブジェクト 2 1,000 3 500 オブジェクト 4 1,500 アプリケーション 商品の情報が格納されたテーブル

5 永続システム:AspectualStore
アスペクト指向の利用 外部ファイルで最適化のヒントを与える アプリケーションのコードを書き換える必要なし 最適化の指示が局所化 DB からのデータ取得を最適化 チューニングが最も必要となるのは永続オブジェクトのコレクションを取得する場合

6 チューニングが必要な例: 文献検索システム
チューニングが必要な例:   文献検索システム 不必要なデータ取得 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 の名前を表示 */ } DB アクセス paper  テーブル Paper の取得 DB アクセス author  テーブル Author の取得 PK name Paper Author for文が回る度毎のSQL発行 Procdng Author 効率の悪いDB アクセス Author 一括して Paper.title と Author.name のみを取得したい

7 AspectualStore での最適化 アスペクト記述 アプリケーションのコードを書き換える必要がない Paper.title と
永続オブジェクトが 取得するデータの指示 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 の名前を表示 */ } DB アクセス DB アクセス paper  テーブル Paper の取得 paper と author を join DB アクセス author  テーブル Author の取得 PK name Paper Author Procdng Author Author アプリケーションのコードを書き換える必要がない

8 記述例: join によるデータ取得 showPaperList メソッド pointcut: before(Proceeding p) :
execution(void showPaperList(..)) && args(p) && … { p.join(“papers”, } showPaperList(Proceeding) メソッドが呼ばれた際 advice: 引数の Proceeding オブジェクト の getPaper() は、Paper.title と Author.name を join によって取得 SQL の発行 showPaperList メソッド SELECT p.title, a.name … INNER JOIN … Proceeding p = …; p.getPapers(); AspectualStore Paper Author DB オブジェクトの生成

9 記述例(AspectJ を利用) XPath による取得データの指定 pointcut : 指示を出すタイミング XPath
before(Proceeding p) : execution(void showPpaerList(..) && args(p) && … { p.join(“papers”, } pointcut : 指示を出すタイミング advice : 取得データの指示 XPath XPath による取得データの指定 pointcut された永続オブジェクト = current node @属性 => 取得するフィールド [条件] => 取得するオブジェクトの選択

10 AspectualStore のアスペクト内で利用可能なライブラリ
タイミング指定用の pointcut loadProperty() フィールドをロードする時点 loadRelationship() 永続オブジェクトのリファレンスを辿る時点 取得データ指定用のメソッド(アドバイス内で利用) add(..), join(..) getter が DB から取得するデータを追加 fetch(..) 指定されたデータを DB から取得 access(..) getter がどのようなオブジェクトを参照するのかを判定 指定には XPath を利用 AspectulStoreの内部構造を知る必要なし

11 アスペクトは最適化のヒント アスペクト記述によってアプリケーションの挙動は変わることはない アスペクト記述 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(); DB Paper.title と Author.name を取得 改めて DB にアクセスし、 Paper.overview を取得

12 AspectualStore の実装 アスペクト記述の言語処理部 永続システム AspectJ を利用
O/R マッピングフレームワークである Cayenne の永続システム部を基に開発 テーブルレコードのプロパティ単位の取得 永続オブジェクト生成時には主キーのみを DB から取得 フィールドにアクセスがあった時点で改めて DB アクセスし、プロパティを取得 getter が取得するデータを変更する機能を永続オブジェクトに追加 DB から取得したデータを適切なオブジェクトに結びつけるための機構

13 O/R マッピングフレームワークによる最適化(従来技術)
List l = s.find(“select Paper.title, Author.name…” + “inner join …” + “where … ” ); 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 の名前を表示 */ } DB アクセス DB アクセス paper  テーブル Paper の取得 paper と author を join DB アクセス author  テーブル Author の取得 Object[] row = l.get(i); Strg title = (Strg)row[0]; Strg name = (Strg)row[1]; PK name title name アプリケーションのコードを大幅に書き換える必要

14 O/R マッピングフレームワーク の問題点 SQL 直書きで必要なデータを選択可能 プログラミングが煩雑
クエリ言語を用いて直接的に永続オブジェクトを取得する方法を用意 プログラミングが煩雑 チューニングの度にSQL を埋め込む SQL に合わせてアプリケーションの変更が必要 モジュラリティの低下 DAO の利用(SQL を一箇所にまとめる) DAO への新たなメソッドの追加 追加したメソッドを利用するようアプリケーションの書き換え SQL に合わせたアプリケーションの変更 Session s = ..; s.find(“SELECT … WHERE price > 1000”);

15 実験 実験内容 文献検索システム Proceeding、Article、Journal のリストを表示し、Proceeding を選択
サーバ: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 文献検索システム 実験内容 Proceeding、Article、Journal のリストを表示し、Proceeding を選択 Proceeding の名前の一覧(10 件ずつ) を表示し、一つを選択 Proceeding の内容、発表されたPaper のタイトル・著者名の一覧を表示し、一つを選択 Paper の内容を表示 DB から10 件づつProceeding オブジェクトの name フィールドを取得 Bibliography proceedings articles journals Article Proceeding Journal join 句によって Paper オブジェクトと Author オブジェクトを 一括取得 title startPage endPage name year papers name publisher Paper Author Publisher Paper オブジェクトの title 以外のフィールドを取得 name papers title author overview pdffile psfile name adress

16 実験(cont’d) 結果 アプリケーションのコードを変更しない O/R マッピングフレームワークに近い最適化が実現できる
永続システム O/R Mapping Framework AspectualStore システム 実行時間(秒) DB アクセス(回) 1.90 1.39 1.48 13 4 5 0.79倍 0.73倍 約半数 アプリケーションのコードを変更しない PK (主キー) を取得 永続オブジェクトを生成 取得データを適切なオブジェクトへ結合 O/R マッピングフレームワークに近い最適化が実現できる 予備的な実験においては、、

17 関連研究 永続システムの最適化技術 PJama [Atkinson, ’96] μDyner [Marc, ’03]
O/R Mapping frameworks Cayenne, Hibernate, Torque… ObjectStore[ Progress Software Corp.] オブジェクト指向データベース PJama [Atkinson, ’96] Java 言語を拡張し、オブジェクトに対する柔軟性の高い永続化を実現 μDyner [Marc, ’03] アスペクト指向を利用した Web キャッシュの動的な先読み

18 まとめ 永続システム AspectualStore の提案・開発 現在の状況 アプリケーションコードを書き換えることなく最適化が可能
プロパティ単位の細やかなデータ取得が可能 現在の状況 言語処理部: AsepctJ を利用 永続システム: O/R マッピングフレームワーク Cayenne を基に開発

19 今後の課題 取得データの指示の簡潔化 より柔軟な永続クラス AspectJ では、指示が簡単とは言い難い より簡潔な記述言語の検討
各永続フィールド毎の getter、setter が必要 より柔軟な永続オブジェクトの定義が可能となるように検討

20 終わり ありがとうございました。

21 AspectualStore の特徴 アスペクト指向を利用した、永続オブジェクトが DB から取得するデータの指示
アプリケーションコードの変更の必要なし 最適化の指示が局所化 プロパティ単位の細やかなデータ取得 永続オブジェクト生成の際には、主キー(PK)と指示のあったプロパティのみを取得 指示のなかったプロパティは必要になった時点で取得 システムのチューニングが容易

22 永続オブジェクトの getter が取得するデータの指示
AspectualStore の概要 アプリケーションの本体コードを変更することなく AOP でチューニングが可能な永続システム オブジェクトと DB テーブルとの対応付け XML ファイル Servlet Contrl AspectualStore 永続システム Bibgrphy author paper Author Paper アスペクト記述 データベース 永続オブジェクトの getter が取得するデータの指示 永続オブジェクト アプリケーション

23 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 を表示 */ } DAO List getPaperTitle(..) List getPaperWithAuthor(..) 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 に新たなメソッドを追加 アプリケーションのコードを追加したメソッドを利用するように書き換える

24 AspectualStore での最適化 Aspect 指示 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 を表示 */ } 永続オブジェクトが 取得するデータの指示 title 指示 PK DB アクセス 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 アクセス PK name 外部キー

25 チューニングが必要な例: 文献検索システム
チューニングが必要な例:     文献検索システム チューニングが最も必要となるのは永続オブジェクトのコレクションを取得する場合 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 を表示 */ } PK title DB アクセス paper  テーブル title フィールドのみ を取得 不必要なデータ取得を防ぐ PK title genre 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  テーブル paper と author を join PK name author  テーブル DB アクセスの頻発を防ぐ

26 チューニングが必要な例: 文献検索システム
チューニングが必要な例:     文献検索システム チューニングが最も必要となるのは永続オブジェクトのコレクションを取得する場合 例えば 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 を表示 */ } PK title DB アクセス paper  テーブル title フィールドのみ を取得 不必要なデータ取得を防ぐ

27 チューニングが必要な例(cont’d) AOP に関する Paper に対してのみ全てのフィールドを取得
paper テーブルと author テーブルとを join Aspect 永続オブジェクトが 取得するデータの指示 指示 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(); /* ジャンルが AOP である p の auhtor の情報を表示 */ } DB アクセス paper  テーブル paper と author を join PK name author  テーブル DB アクセスの頻発を防ぐ

28 チューニングが必要な例: 文献検索システム
チューニングが必要な例:     文献検索システム チューニングが最も必要となるのは永続オブジェクトのコレクションを取得する場合 例えば 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 を表示 */ } PK title DB アクセス paper  テーブル title フィールドのみ を取得 不必要なデータ取得を防ぐ

29 記述例(1): join によるデータ取得 pointcut:指示を出すタイミング before(Proceeding p) :
execution(void showPaperList(..)) && args(p) && … { p.join(“papers”, } showPaperList(Proceeding) メソッドが呼ばれた際 advice:取得データの指示 引数の Proceeding オブジェクト の getPaper() は、Paper の title フィールドと Author の name フィールドを join によって取得 SELECT p.*, a.* FROM paper AS p INNER JOIN author AS a ON p.authorid = a.authorid WHERE p.proceedingid = 10; Proceeding p = …; p.getPapers(); Paper オブジェクト、 Author オブジェクトの生成 DB

30 記述例(2): where によるデータ取得 void around(Proceeding p) : pointcut:指示を出すタイミング
this(p) && loadRelationship() && if(access(thisJoinPoint, “Paper”) && … { fetch(p, } pointcut:指示を出すタイミング Proceeding オブジェクトの  getPaper() メソッドが呼ばれた際 advice:取得データの指示 ジャンルが AOP である Paper オブジェクトの title フィールドに対するデータを取得 SELECT p.paperid, p.title FROM paper AS p WHERE p.proceedingid = 10 and p.Jenre = AOP Proceeding p = …; p.getPapers(); Paper オブジェクトの生成 DB

31 AspectualStore の実装 AspectualStore 本体の実現方法
テーブルレコードのプロパティ毎の取得 永続オブジェクト生成時には PK のみを取得 データ取得の指示を出すための API を用意 取得データの指定方法には、プロトタイプとしてAspectJ を利用 pointcut:取得データを指定するタイミングを決定 advice :取得するデータの指示

32 記述例: join によるデータ取得(AspectJ)
pointcut:指示を出すタイミング before(Proceeding p) : execution(void showPaperList(..)) && args(p) && … { p.join(“papers”, } showPaperList(Proceeding) メソッドが呼ばれた際 advice:取得データの指示 引数の Proceeding オブジェクト の getPaper() は、Paper.title と Author.name を join によって取得 SQL の発行 SELECT p.title, a.name … INNER JOIN … Proceeding p = …; p.getPapers(); AspectualStore Paper Author DB オブジェクトの生成


Download ppt "アスペクト指向を利用した永続オブジェクト・アクセスの高速化"

Similar presentations


Ads by Google