n n List papers Author a 0 Author

  • Slides: 23
Download presentation

高速化のためのカスタマイズ例 n 効率よくデータを取得したい ¨ 今後利用されるデータを先読みし、まとめて取得したい n 処理内容に応じて先読みするデータをカスタマイズ List papers Author a 0 Author a

高速化のためのカスタマイズ例 n 効率よくデータを取得したい ¨ 今後利用されるデータを先読みし、まとめて取得したい n 処理内容に応じて先読みするデータをカスタマイズ List papers Author a 0 Author a 1 Author a 2 Paper p 0 Paper p 1 Paper p 2 Genre g 0 Genre g 1 Genre g 2 void show. Paper. List(List papers) { Iterator it = papers. iterator(); while(it. has. Next()) { Paper p = (Paper)it. next(); Author show(p); }} を取得 void get. Genres(List papers) { while(…) { Paper p = (Paper)it. next(); Genre g = p. get. Genre(); Author ではなく …. }} Genre を取得 過剰な DB アクセス 過剰なDB アクセス <RDB> papers authrs 4

従来のオブジェクト指向によるクラス ごとのカスタマイズ n 効率のよいデータ取得が実現出来ない DB アクセスをなくそうとすると、不必要なデータを 大量に取得してしまう void get. Genres(List papers) { ¨ 過剰な

従来のオブジェクト指向によるクラス ごとのカスタマイズ n 効率のよいデータ取得が実現出来ない DB アクセスをなくそうとすると、不必要なデータを 大量に取得してしまう void get. Genres(List papers) { ¨ 過剰な class Paper { @FETCH Author author; @FETCH Genre genre; String title; …} void show. Papr. List(List papers) { Iterator it = papers. iterator(); while(it. has. Next()) { Author を取得 Paper p = (Paper)it. next(); Genre は不要 show(p); }} while(…) { Paper p = (Paper)it. next(); Genre g = p. get. Genre(); …. }} Genre を取得 Author は不要 過剰なDB アクセス <RDB> papers authrs 5

アスペクト記述 n メソッド処理ごとのデータ取得の指示 class Prefetch. Define { @before(“{Persistable p = $1; Loader l =

アスペクト記述 n メソッド処理ごとのデータ取得の指示 class Prefetch. Define { @before(“{Persistable p = $1; Loader l = $1. get. Body(). get. Loader(); l. add. Fetch(“author”); l. load(); }”) Pointcut p 1 = Pcd. call(“show. Paper. List(. . )”); @before(“{ Persistable p = $1; Loader l = $1. get. Body(). get. Loader(); l. add. Fetch(“author”); l. load(); }”) Pointcut p 2 = Pcd. call(“get. Genres(. . )”); } show. Paper. List() に対する最適化 ・ Author オブジェクトを先読み get. Genres() に対する最適化 ・ Genres オブジェクトを先読み 8

アスペクト記述: Gluon. J @Glue public class Prefetch. Define { /* Context の定義 */ @Refine static

アスペクト記述: Gluon. J @Glue public class Prefetch. Define { /* Context の定義 */ @Refine static class Context. Define extends Context { Set loaded. Fields = new Hash. Set(); int depth = 0; } Context クラスに DB アクセス履歴を 格納するためのフィールドを定義 /* DB アクセスを引起したパスの格納 */ @Before(“{ // フィールド名を格納}") Pointcut pc = Pcd. call(". . . Persistent. Entity#load*(…)"); papers に付加された Context に show. Paper. List() 内で DB アクセスを 引き起こしたフィールドのパスを追加 /* prefetch 定義 */ @Refine static class Iterator. Define extends Persistent. Iterator { public Object next(Context cxt) { if(context. has. Loaded. Fields()) // context の内容を先読み super. next(cxt); }} Iterator. next() を拡張して、 本来の処理の前に先読み処理を追加 10

最適化を指示する API n 永続オブジェクトに直感的に指示が出せる API ¨ 直接 SQL を記述するのは煩雑すぎる n 外部キーの名前と値が必要 n 記述すべき SQL

最適化を指示する API n 永続オブジェクトに直感的に指示が出せる API ¨ 直接 SQL を記述するのは煩雑すぎる n 外部キーの名前と値が必要 n 記述すべき SQL はリファレンスの辿られ方によって異なる <Hibernate によるデータ取得の記述> “FROM Paper FETCH p. title LEFT JOIN FETCH p. author. . WHERE t 0. prc_id = 98” Proceeding prc Journal jrl Genre gen author. name と title を取得 <データベース> PK title List papers Paper X Paper P Paper Q prc_id 98 98 著者X’ name 著者P’ name 98 paperテーブル PK name 著者Q’ name 12 authorテーブル

最適化を指示する API n 発行する SQL はリファレンスの辿られ方によって異なる Proceeding prc <Proceeding から 取得された場合> “FROM Paper FETCH

最適化を指示する API n 発行する SQL はリファレンスの辿られ方によって異なる Proceeding prc <Proceeding から 取得された場合> “FROM Paper FETCH p. title LEFT JOIN FETCH p. author. . WHERE t 0. prc_id = 5” Journal journl PK 5 proceeding テーブル <Journal から取得された場合> PK “FROM Paper FETCH p. title LEFT JOIN FETCH p. author. . WHERE t 0. jrl_id = 18” 18 journal テーブル List papers author. name と title を取得 Paper X 著者X’ Paper P 著者P’ Paper Q 著者Q’ PK prc_id 1 5 2 3 4 5 6 5 5 jrl_id 18 18 18 paperテーブル 13

Aspectual. Store による最適化の得失 n アプリケーションの挙動を変える最適化はできない ¨ 誤った最適化指示は無視される n JDBC で直接指示する程の最適化は出来ない 例) 主キーは必ず取得 Proceeding prc

Aspectual. Store による最適化の得失 n アプリケーションの挙動を変える最適化はできない ¨ 誤った最適化指示は無視される n JDBC で直接指示する程の最適化は出来ない 例) 主キーは必ず取得 Proceeding prc = …; List papers = prc. get. Paprs(); for( Paper p : papers) { if(p. get. Genre(). equals(“AOP”) { // show Paper details. Proceeding prc }} Expression exp = Exp. Factory. eq(“genre”, “AOP”); loader. add(exp); papers Paper p 1 AOP Paper p 3 Paper p 4 Paper p 6 AOP AOP PK genre 1 AOP 2 3 4 AOP 5 6 paperテーブル 18

時間・DBアクセス・ メモリ量の比較実験 n 既存の永続システム ¨ n オブジェクト指向によるクラス 毎の最適化 Aspectual. Store ¨ n 文献検索システム アスペクト指向による文脈に

時間・DBアクセス・ メモリ量の比較実験 n 既存の永続システム ¨ n オブジェクト指向によるクラス 毎の最適化 Aspectual. Store ¨ n 文献検索システム アスペクト指向による文脈に 応じた最適化 SQL 直書き ¨ JDBC を直接利用してほしい データを指示 サーバ:P 4 Xeon 3. 06 G, 2 GB, Postgre. SQL 7. 4. 2 DBサーバ:Linux 2. 6. 7 アプリケーションサーバ:Mac OSX Tomacat 5. 5, Java 1. 5 LAN 1000 Base. TX Bibliography journals year proceedngs Proceeding Journal name intro papers name vol papers Paper title abstract content genre Genre name author papers Author name age location Location country town 19