アプリケーションに応じた AOP による高速化が可能な 永続システム

Slides:



Advertisements
Similar presentations
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
Advertisements

モバイルエージェントシステムの実装 エージェント移動(状態とコードの一括移送) エージェント移動の特徴 システム構成 エージェントプログラム
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
JPAを利用した RESTful Webサービスの開発
Javaのための暗黙的に型定義される構造体
データマイニングのための柔軟なデータ取得、操作を支援するAPIの設計
SQL J2EE I 第3回 /
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングと Dependency Injection の融合
Flyingware : バイトコード変換による 安全なエージェントの実行
J2EEアプリケーションにおける アプリケーションレベルスケジューリング
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
実行時情報に基づく OSカーネルのコンフィグ最小化
Jakarta Struts (2) ソフトウェア特論 第11回.
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
既存Javaプログラム向け 分散化支援システムの開発
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アスペクト指向を利用した永続オブジェクト・アクセスの高速化
アスペクト指向言語のための 独立性の高いパッケージシステム
アプリケーション依存の先読みが可能なO/Rマッピングツール
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
Java における 先進的リフレクション技術
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
コーディングパターンの あいまい検索の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
EntityManager と EJB QL EJB 3.0 コース 第8回 2006年8月5日.
分散 Java プログラムのための アスペクト指向言語
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
C#プログラミング実習 第3回.
Javaによる Webアプリケーション入門 第4回
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
コレクション・フレームワーク データベース論 第7回.
Annotation EJB 3.0 コース 第3回 2006年8月4日.
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラム分散化のための アスペクト指向言語
統合開発環境のための プログラミング言語拡張 フレームワーク
開発者との対話を活かした 横断的構造の表現
JAVA入門⑥ クラスとインスタンス.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
SQL J2EE I (データベース論) 第3回 /
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

アプリケーションに応じた AOP による高速化が可能な 永続システム 数理・計算科学専攻 千葉研究室 青木 康博 指導教官: 千葉 滋

永続オブジェクト・システム リファレンスを辿る際に自動的に SQL 発行 データベースを意識する必要がない EJB2 など リファレンスを辿る際に自動的に SQL 発行 データベースを意識する必要がない O/R 間のインピーダンス・ミスマッチを解消 アプリケーションの開発効率を高める < paper table > 永続クラス 1 Josh ・・・ 30 class Paper { String title Author author; … } class Author { String name; Location location; …. Paper p = …; Author a = p.author 2 GlunJ 98 ・・・ 自動的なデータ取得 id title authr_id < author table > SELECT id FROM author t0 WHERE t0.id = 98 ・・・ 98 Aoki 99 Tobe ・・・ データベース id name

リファレンスを辿る毎に SQL を発行していては 効率が悪すぎる 高速化の必要性 リファレンスを辿る毎に SQL を発行していては 効率が悪すぎる データベースからの効率よいデータ取得が必要 まとめてデータを取得すれば SQL 発行を最適化出来る E.g.) Author オブジェクトのみを一括して取得したい void showPaperList(List papers) { Iterator it = papers.iterator(); while(it.hasNext()) { Paper p = (Paper)it.next(); Author a = p.getAuthor(); / * p.title と a.name を表示 */ } <RDB> Author を取得 authrs papers 過剰なDB アクセス

高速化のためのカスタマイズ例 効率よくデータを取得したい 今後利用されるデータを先読みし、まとめて取得したい <RDB> 処理内容に応じて先読みするデータをカスタマイズ List papers Paper a0 a1 a2 Author p0 g0 g1 g2 Genre void getGenres(List papers) { while(…) { Paper p = (Paper)it.next(); Genre g = p.getGenre(); ….}} 過剰な DB アクセス Paper p1 Paper Author ではなく Genre を取得 p2 void showPaperList(List papers) { Iterator it = papers.iterator(); while(it.hasNext()) { Paper p = (Paper)it.next(); show(p);}} <RDB> 過剰なDB アクセス authrs Author を取得 papers

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

提案: AspectualStore の開発 アスペクト指向による高速化を支援する永続システム アプリケーションの文脈に応じたクラス横断的なカスタマイズ リファレンスの辿られ方に応じて最適化の指示を変更できる showPaperList(List) { … } Proceeding Paper Author prc List papers p0 ownr p0 最適化の 指示 getGenres(List) { … } p1 Paper Genre p0 gnr p2 最適化の指示をアスペクトとして分離 徐々に最適化の指示を追加できる

永続システム: AspectualStore アスペクト指向による高速化を支援 コード量: 18,000 行程度 外部企業が現在デモアプリを AspectualStore 上で 開発中 より大規模な実験を行う予定 <デモアプリ>

アスペクト記述 メソッド処理ごとのデータ取得の指示 class PrefetchDefine { @before(“{Persistable p = $1; Loader l = $1.getBody().getLoader(); l.addFetch(“author”); l.load(); }”) Pointcut p1 = Pcd.call(“showPaperList(..)”); @before(“{ Persistable p = $1; Pointcut p2 = Pcd.call(“getGenres(..)”); } showPaperList() に対する最適化 ・ Author オブジェクトを先読み getGenres() に対する最適化 ・ Genres オブジェクトを先読み

先読みすべきデータを動的に決定するアスペクトも可能 どのようにリファレンスが辿られるかを検出 リファレンスの辿られ方がわかりにくい場合 最適化の指示をまとめて記述したい場合 void showPaprList(List papers) { Iterator it = papers.iterator(); while(it.hasNext()) { Paper p = (Paper)it.next(); show(p); …}} papers 1st iteration : リファレンスの辿り方を収集 2nd iteration : papers 先読みの指示を出す それ以降の DB アクセスは 発生しない! Paper p0 Author a name title Location Paper p1 title Author a name ・・・ Paper p2 ・・・

アスペクト記述: GluonJ Context クラスに DB アクセス履歴を格納するためのフィールドを定義 @Glue public class PrefetchDefine { /* Context の定義 */ @Refine static class ContextDefine extends Context { Set loadedFields = new HashSet(); int depth = 0; } /* DB アクセスを引起したパスの格納 */ @Before(“{ // フィールド名を格納}") Pointcut pc = Pcd.call("...PersistentEntity#load*(…)"); /* prefetch 定義 */ @Refine static class IteratorDefine extends PersistentIterator { public Object next(Context cxt) { if(context.hasLoadedFields()) // context の内容を先読み super.next(cxt); }} Context クラスに DB アクセス履歴を格納するためのフィールドを定義 papers に付加された Context に showPaperList() 内で DB アクセスを 引き起こしたフィールドのパスを追加 Iterator.next() を拡張して、 本来の処理の前に先読み処理を追加

アスペクトによる最適化の支援 既存の永続システム + AOP だけでは不十分 AspectualStore が提供する主な機能 最適化の指示に煩雑な記述が必要 リファレンスの辿られ方を管理する必要がある アスペクト内からアプリケーションの文脈を利用出来ない AspectualStore が提供する主な機能 最適化を行ための API 永続オブジェクト(コレクション) への最適化の指示 アプリケーションの文脈を格納するための機構 アスペクトからアプリケーションの文脈を利用可能 Tomcat からのロードタイム・ウィービング アスペクトのウィーブ / アンウィーブの手間を削減

最適化を指示する API 永続オブジェクトに直感的に指示が出せる API 直接 SQL を記述するのは煩雑すぎる 外部キーの名前と値が必要 “FROM Paper FETCH p.title LEFT JOIN FETCH p.author.. WHERE t0.prc_id = 98” <Hibernate によるデータ取得の記述> author.name と title を取得 <データベース> PK title prc_id List papers 98 Proceeding 98 Paper X prc 著者X’ 著者P’ 著者Q’ 98 Journal Paper P name paperテーブル jrl journl PK name Paper Q name Genre gen name authorテーブル

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

最適化を指示する API 永続オブジェクトに直感的に指示が出せる API 直接 SQL を記述するのは煩雑すぎる 外部キーの名前と値が必要 author.name と title を取得 loader.addFetch(“title”); loader.addFetch(“author.name”); loader.load(); <AspectualStore> <データベース> PK title List papers Paper X 著者X’ 著者P’ 著者Q’ ・データベースに関する作業を 意識する必要がない ・外部キーの名前や値 ・どのようにリファレンスを辿ってきたかを AspectualStore が内部で管理 (後述) Paper P paperテーブル journl PK name Paper Q authorテーブル

アプリケーションの文脈を格納 文脈を格納するための機構 アスペクトからアプリケーションの文脈を利用したい メソッド内でどのようなリファレンスが辿られるか SQL を発行するためには、親オブジェクトが必要 既存の永続システム + AOP では不十分 時間的に素なデータ・アクセスの取得は困難 refine や cflow を駆使した煩雑な記述が必要 永続オブジェクトは何度も再利用される 単純に親への参照を持たせるだけでは不十分 [’05 Awais ら] Proceedng prc List papers Paper p0 Author a Location title name Paper p1 Journal j ・・・

アプリケーションの文脈を利用可能 永続オブジェクトに Context オブジェクトを付加 キャッシュ: 何度も再利用される E.g.) 論文X => 学会Wから参照 論文X’=> 著者Aから参照 学会W Set 論文P <モデル> <キャッシュ> 論文X author 著者A papers 論文Q Paper PersistentEntity entity context values state 論文X’ 共有 <文脈情報> 個別 個別 Context キャッシュ Contxt Contxt 親コンテキストへの参照 親コレクションへの参照 title=“aop” year=1999 親: 学会 親: 著者A

ロードタイム・ウィービング ウィーブ/アンウィーブにかかる手間を削減 AspectualStore への拡張を JAR ファイルに反映させる必要なし Tomcat 用のクラスローダを実装 <アプリケーション起動時> 永続クラスへのバイトコード変換 ・ 永続化処理の追加 (リファレンスが参照された 際の SQL 発行) ・ Context クラスの追加 <クラスのロードタイム時> アスペクト記述の反映 Common CL Catalina CL Shared CL WebApp CL ASClassLoader

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

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

実験結果 既存の永続システムに比べて大幅な速度向上を確認 DB 通信回数 / 取得データ数の削減 オブジェクト生成数は同等 実行時間 (秒) 括弧内は主キー と 外部キーを除いた値 実行時間 (秒) DB 通信 (回) オブジェクト 生成 (個) 取得データ 数 (個) 既存永続システム 3.48 43 381 2528(1522) AspectualStore 2.46 8 381 759(289) 30%向上 SQL 直書き 2.16 6 181 471(287) 38%向上 既存の永続システムに比べて大幅な速度向上を確認 DB 通信回数 / 取得データ数の削減 オブジェクト生成数は同等 予備的な実験 においては…

関連研究1:O/R mapper SQL 直書きとリファレンス参照の併用 リファレンス参照は従来同様、非効率 Hibernate Cayenne Torque … SQL 直書きとリファレンス参照の併用 String query = “FROM Proceeding p LEFT JOIN FETCH p.papers LEFT JOIN FETCH p.papers.author WHERE …”; // ルート・オブジェクトの取得 Proceeding p = s.createQuery(query).load; List<Papers> papers = p.getPapers(); showPaperList(papers); 利用されそうなオブジェクトを ルート・オブジェクトに含める リファレンス参照は従来同様、非効率 高速な参照が必要なときは SQL を直接書く AspectualStore ではSQL ではなく高速化のヒントを記述 最適化コードが元のプログラムに混在

関連研究2:自動的な最適化 アスペクト記述が必要ない AUTOFETCH [Ali et al. ‘06] AspectualStore Context-cotrolled prefetch [Philip at al. ‘99] データベースのアクセス・パターンを基に最適化 AUTOFETCH [Ali et al. ‘06] プロファイリングによる最適化 PrefetchGuide [Wook-Shin et al. ‘03] 実行時のアクセス・ログによる動的な最適化 AspectualStore 手動できめ細かな最適化 メソッド処理などのオブジェクト以外の文脈も利用可能 性能テストをしながら徐々に最適化が可能

まとめ AOP を利用して高速化が可能な永続システム: AspectualStore の開発 (コード量: 約18,000 行) アプリケーション文脈に応じた最適化が可能 クラス横断的な処理を AOP でモジュール化 クラス毎の最適化指示だけでは不十分 AOP による最適化を容易に実現する構造を用意 永続オブジェクトへ指示を出すための API アプリケーションの文脈を格納するための機構 ロードタイム・ウィービング