アスペクト指向を利用した永続 オブジェクト・アクセスの高速化 東京工業大学 千葉研究室 青木 康博 千葉 滋 佐藤 芳樹(現 三菱総研) 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
© Copyright 2024 ExpyDoc