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

Slides:



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

DBを 256倍 活用する方法 ~S2Dao PHP/.NET/Java.
DB(データベース)のおはなし 作成者:小野正広 DBと言っても、  ドラゴンボール ではないですぞ! 3/1/2017.
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
リレーショナル・データベース データベース論 第10回.
JPAを利用した RESTful Webサービスの開発
S2Container.NET, S2Dao.NET コミッタ 藤井 宏明
Javaのための暗黙的に型定義される構造体
データマイニングのための柔軟なデータ取得、操作を支援するAPIの設計
ACCESSによる データベースアプリケーション開発実習 日本工業大学 情報工学科 “データベースの実際” 教材
SQL J2EE I 第3回 /
卒研:データベースチーム 第4回 DOMを使った処理
JavaBeans とJSP データベース論 第5回.
JSFによるWebアプリケーション開発 第6回
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
パフォーマンスチューニング on Rails
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
マイクロソフト Access での SQL 演習 第1回 SQL問い合わせ(クエリ)
C++とオブジェクトデータベース入門 8.オブジェクトデータベースとは 森井 喬 Webページ
アスペクト指向プログラミングを用いたIDSオフロード
アスペクト指向プログラミングと Dependency Injection の融合
入出力データ型に透過な Webサービス動的実行システム 松江工業高等専門学校 情報工学科 越田高志 情報処理学会第68回全国大会
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
アプリケーションに応じた AOP による高速化が可能な 永続システム
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
Webアプリケーションの方向性 データベース論 第13回.
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
実行時情報に基づく OSカーネルのコンフィグ最小化
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
Jakarta Struts (2) ソフトウェア特論 第11回.
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
Javaによる Webアプリケーション入門 第11回
アスペクト指向言語のための 独立性の高いパッケージシステム
アプリケーション依存の先読みが可能なO/Rマッピングツール
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
3.リレーショナルデータベース,主キー, SQL
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
EntityManager と EJB QL EJB 3.0 コース 第8回 2006年8月5日.
分散 Java プログラムのための アスペクト指向言語
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
Javaによる Webアプリケーション入門 第4回
Annotation EJB 3.0 コース 第3回 2006年8月4日.
「マイグレーションを支援する分散集合オブジェクト」
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
WebアプリケーションとTomcat ― これまでの復習とこれからの予習 ―
Action Method の実装 J2EE II 第9回 2004年12月2日.
リレーショナル・データベース J2EE I (データベース論) 第2回 /
Jakarta Struts (1) ソフトウェア特論 第10回.
ユビキタスコンピューティングの ための ハンドオーバー機能付きRMIの実装
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
SQL J2EE I (データベース論) 第3回 /
プログラム理解のための 付加注釈 DocumentTag の提案
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
JSFによるWebアプリケーション開発 第7回
MVCモデル2による Webアプリケーション
SQL データベース論 第11回.
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

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

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

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

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

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

チューニングが必要な例: 文献検索システム チューニングが必要な例:   文献検索システム 不必要なデータ取得 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 のみを取得したい

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 アプリケーションのコードを書き換える必要がない

記述例: join によるデータ取得 showPaperList メソッド pointcut: before(Proceeding p) : execution(void showPaperList(..)) && args(p) && … { p.join(“papers”, “./Paper/@title”, “./Paper/Author/@name”); } 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 オブジェクトの生成

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

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

アスペクトは最適化のヒント アスペクト記述によってアプリケーションの挙動は変わることはない アスペクト記述 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 を取得

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

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 アプリケーションのコードを大幅に書き換える必要

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

実験 実験内容 文献検索システム 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 …

実験(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 マッピングフレームワークに近い最適化が実現できる 予備的な実験においては、、

関連研究 永続システムの最適化技術 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 キャッシュの動的な先読み

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

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

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

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

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

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 に新たなメソッドを追加 アプリケーションのコードを追加したメソッドを利用するように書き換える

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 外部キー

チューニングが必要な例: 文献検索システム チューニングが必要な例:     文献検索システム チューニングが最も必要となるのは永続オブジェクトのコレクションを取得する場合 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 アクセスの頻発を防ぐ

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

チューニングが必要な例(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 アクセスの頻発を防ぐ

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

記述例(1): join によるデータ取得 pointcut:指示を出すタイミング before(Proceeding p) : execution(void showPaperList(..)) && args(p) && … { p.join(“papers”, “./Paper/@title”, “./Paper/Author/@name”); } 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

記述例(2): where によるデータ取得 void around(Proceeding p) : pointcut:指示を出すタイミング this(p) && loadRelationship() && if(access(thisJoinPoint, “Paper”) && … { fetch(p, “./Paper[@jenre=AOP]/@title”); } 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

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

記述例: join によるデータ取得(AspectJ) pointcut:指示を出すタイミング before(Proceeding p) : execution(void showPaperList(..)) && args(p) && … { p.join(“papers”, “./Paper/@title”, “./Paper/Author/@name”); } 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 オブジェクトの生成