(57)【要約】【課題】計算システムにかかる負荷などをなるべく抑えつつ、様々な種類のコンポーネントを横断するデータも網羅的に監視可能なデータフローログを生成する。【解決手段】本発明の一態様としてのデータフローログ生成装置は、プロセスである第１コンポーネント内の第１オブジェクトと、第２コンポーネントとの間におけるデータフローが生じた場合において、前記第１コンポーネントにおける、前記データフローの始点または終点を示す第１位置情報を取得する第１取得部と、前記第２コンポーネントにおける、前記データフローの始点または終点を示す第２位置情報を取得する第２取得部と、前記第１位置情報と前記第２位置情報とが記録されたデータフローログを生成するログ生成部と、を備える。【選択図】図１
2017130111.tif 000002
【特許請求の範囲】
【請求項１】
プロセスである第１コンポーネント内の第１オブジェクトと、第２コンポーネントとの間におけるデータフローが生じた場合において、前記第１コンポーネントにおける、前記データフローの始点または終点を示す第１位置情報を取得する第１取得部と、
前記第２コンポーネントにおける、前記データフローの始点または終点を示す第２位置情報を取得する第２取得部と、
前記第１位置情報と前記第２位置情報とが記録されたデータフローログを生成するログ生成部と、
を備えるデータフローログ生成装置。
【請求項２】
前記第１取得部と、前記第２取得部と、前記ログ生成部は、前記第１コンポーネントの前記プロセス内にて稼働する
請求項１に記載のデータフローログ生成装置。
【請求項３】
前記第１コンポーネント内のオブジェクトの識別子を管理する第１識別子管理部
をさらに備え、
前記第１取得部は、前記第１識別子管理部から前記第１オブジェクトの識別子を前記第１位置情報の一部または全部として取得する
請求項１または２に記載のデータフローログ生成装置。
【請求項４】
前記第２コンポーネントはリレーショナルデータベースであり、
前記データフローには、前記リレーショナルデータベースから前記第１オブジェクトへのデータ読み込みが含まれ、
前記第２取得部は、前記リレーショナルデータベースから、前記データ読み込みに係るデータが格納されていた位置を、前記第２位置情報として取得する
請求項１ないし３のいずれか一項に記載のデータフローログ生成装置。
【請求項５】
前記第２コンポーネントはリレーショナルデータベースであり、
前記データフローには、前記第１オブジェクトから前記リレーショナルデータベースへのデータ書き込みが含まれ、
前記データ書き込みに係るデータを格納する保存部をさらに備え、
前記第２取得部は、前記保存部に格納されたデータに基づき、前記リレーショナルデータベースから、前記データ書き込みに係るデータが格納された位置を、前記第２位置情報として取得する
請求項１ないし４のいずれか一項に記載のデータフローログ生成装置。
【請求項６】
前記第２位置情報には、前記リレーショナルデータベースのデータベース名、カタログ名、スキーマ名、テーブル名、列の名前、およびテーブルの主キーのいずれか１つが含まれる
請求項４または５に記載のデータフローログ生成装置。
【請求項７】
前記第２取得部は、前記リレーショナルデータベースに対し、自動コミット設定の有効化または無効化に関する命令を行う
請求項４ないし６のいずれか一項に記載のデータフローログ生成装置。
【請求項８】
前記第２コンポーネントはファイルサービスであり、
前記データフローには、前記ファイルサービスから前記第１オブジェクトへのデータ読み込みまたは前記第１オブジェクトから前記ファイルサービスへのデータ書き込みが含まれ、
前記第２取得部は、前記ファイルサービスから、前記データ読み込みまたは前記データ書き込みに係るファイルのパスと、前記ファイルにおける前記データ読み込みまたは前記データ書き込みに係るデータの位置を示すファイルポインタとの少なくとも一方を、前記第２位置情報の一部または全部として取得する
請求項１ないし３のいずれか一項に記載のデータフローログ生成装置。
【請求項９】
前記第２コンポーネントはプロセスであり、
前記データフローには、前記第２コンポーネントにおける第２オブジェクトから前記第１オブジェクトへのデータフローが含まれ、
前記第２取得部は、前記第２オブジェクトの識別子と、前記第２コンポーネントのプロセスＩＤを前記第２位置情報の一部または全部として取得し、
前記第１取得部は、前記第１オブジェクトの識別子と、前記第１コンポーネントのプロセスＩＤとを、前記第１位置情報の一部または全部として取得する
請求項１ないし３のいずれか一項に記載のデータフローログ生成装置。
【請求項１０】
前記第２取得部は、前記第２コンポーネントにてシリアライズされた前記第２オブジェクトの識別子を取得し、
前記第１取得部は、前記第１コンポーネントにてデシリアライズされた前記第２オブジェクトの識別子を、前記第１オブジェクトの識別子として取得する
請求項９に記載のデータフローログ生成装置。
【請求項１１】
前記第１オブジェクトと前記第１コンポーネント内の異なる第２オブジェクトとの間におけるデータフローが生じた場合において、
前記第１取得部は、前記第１オブジェクトの識別子を前記第１位置情報の一部または全部として取得し、前記第２オブジェクトの識別子を前記第２位置情報の一部または全部として取得する
請求項１ないし１０のいずれか一項に記載のデータフローログ生成装置。
【請求項１２】
前記第１取得部は、前記第１コンポーネントのプロセスＩＤを前記第１位置情報の一部としてさらに取得する
請求項９または１０に従属する請求項１１に記載のデータフローログ生成装置。
【請求項１３】
前記第２位置情報を格納する第２位置情報格納部と、
請求項４ないし７のいずれか一項に記載のデータフローログ生成装置に対し、前記第２位置情報を送信する送信部と、
を備えたリレーショナルデータベース。
【請求項１４】
前記リレーショナルデータベースは、
データの書き込み先位置情報を一時的に格納する一時的データ格納部と、
前記第１コンポーネントからデータが書き込まれたときに、書き込まれたデータの書き込み先位置情報を一時的データ格納部に複製するトリガー
を備えた請求項１３に記載のリレーショナルデータベース。
【請求項１５】
プロセスである第１コンポーネント内の第１オブジェクトと、第２コンポーネントとの間におけるデータフローが生じた場合において、前記第１コンポーネントにおける、前記データフローの始点または終点を示す第１位置情報を取得する第１取得ステップと、
前記第２コンポーネントにおける、前記データフローの始点または終点を示す第２位置情報を取得する第２取得ステップと、
前記第１位置情報と前記第２位置情報とが記録されたデータフローログを生成するログ生成ステップと、
をコンピュータが実行するデータフローログ生成方法。
【請求項１６】
プロセスである第１コンポーネント内の第１オブジェクトと、第２コンポーネントとの間におけるデータフローが生じた場合において、前記第１コンポーネントにおける、前記データフローの始点または終点を示す第１位置情報を取得する第１取得ステップと、
前記第２コンポーネントにおける、前記データフローの始点または終点を示す第２位置情報を取得する第２取得ステップと、
前記第１位置情報と前記第２位置情報とが記録されたデータフローログを生成するログ生成ステップと、
をコンピュータに実行させるためのプログラム。
【請求項１７】
プロセスである第１コンポーネントと、第２コンポーネントと、前記第１コンポーネントと前記第２コンポーネントの間において行われるデータフローに係るログを受信するログ受信部と、を備えた監視システムであって、
前記第２コンポーネントは、
前記第２コンポーネントにおける、前記データフローの始点または終点を示す第２位置情報を送る送出部
を備え、
前記第１コンポーネントは、
前記第１コンポーネントにおける、前記データフローの始点または終点を示す第１位置情報を取得する第１取得部と、
前記第２位置情報を、前記送出部から取得する第２取得部と、
前記第１位置情報と前記第２位置情報とが記録されたデータフローログを生成するログ生成部と、
を備える監視システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、データフローログ生成装置、リレーショナルデータベース、データフローログ生成方法、プログラム、および監視システムに関する。
【背景技術】
【０００２】
近年、計算機の処理効率の向上、情報サービスの高度化などに伴い、複数の計算機およびプログラムが連携して動作する計算システムが一般化している。このような計算システムにおいて、計算処理の異常の検出、セキュリティ診断、デバッグ、性能監視、性能劣化要因分析などを実現するために、複数のプログラムを横断したデータの流れ（データフロー）を観測・監視することが知られている。
【０００３】
上記のようなデータフローの監視を行う監視手法は、（１）データが、例えば、プロセス、ファイル、データベースなどの様々な種類のコンポーネントを横断する場合でも網羅的に監視できることが求められる。しかし、例えば、ＯＳ標準の監視機能を用いると、ファイルやプロセス間通信に基づくデータフローを監視することはできるが、プロセス内部のデータフロー、またはプロセスとデータベースとの間のデータフローを監視することは難しい。
【０００４】
一方で、（２）計算システムにかかる負荷（オーバーヘッド）または構成変更をなるべく小さく抑えられることも求められる。例えば、コンポーネントを横断するデータフローを観測するために識別用のメタデータを付与する仕組みを追加すると、計算システムにかかる負荷等が増加してしまう。ゆえに、網羅的な監視と計算システムにかかる負荷とをいかにして両立させるかが重要となる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１３−２４２６３３号公報
【非特許文献】
【０００６】
【非特許文献１】Ｃｈｕｎ  Ｈｕｉ  Ｓｕｅｎ，  Ｒｙａｎ  Ｋ  Ｌ  Ｋｏ，  Ｙｕ  Ｓｈｙａｎｇ  Ｔａｎ，  Ｐｅｔｅｒ  Ｊａｇａｄｐｒａｍａｎａ，  Ｂｕ  Ｓｕｎｇ  Ｌｅｅ，“Ｓ２Ｌｏｇｇｅｒ：  Ｅｎｄ−ｔｏ−Ｅｎｄ  Ｄａｔａ  Ｔｒａｃｋｉｎｇ  Ｍｅｃｈａｎｉｓｍ  ｆｏｒ  Ｃｌｏｕｄ  Ｄａｔａ  Ｐｒｏｖｅｎａｎｃｅ，”Ｉｎ  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  １２ｔｈ  ＩＥＥＥ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｃｏｎｆｅｒｅｎｃｅ  ｏｎ  Ｔｒｕｓｔ，  Ｓｅｃｕｒｉｔｙ  ａｎｄ  Ｐｒｉｖａｃｙ  ｉｎ  Ｃｏｍｐｕｔｉｎｇ  ａｎｄ  Ｃｏｍｎｍｕｎｉｃａｔｉｏｎｓ  （ＴｒｕｓｔＣｏｍ  ‘１３），ｐ．５９４−６０２．
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明の実施形態は、計算システムにかかる負荷などをなるべく抑えつつ、様々な種類のコンポーネントを横断するデータも網羅的に監視可能なデータフローログを生成する。
【課題を解決するための手段】
【０００８】
本発明の一態様としてのデータフローログ生成装置は、プロセスである第１コンポーネント内の第１オブジェクトと、第２コンポーネントとの間におけるデータフローが生じた場合において、前記第１コンポーネントにおける、前記データフローの始点または終点を示す第１位置情報を取得する第１取得部と、前記第２コンポーネントにおける、前記データフローの始点または終点を示す第２位置情報を取得する第２取得部と、前記第１位置情報と前記第２位置情報とが記録されたデータフローログを生成するログ生成部と、を備える。
【図面の簡単な説明】
【０００９】
【図１】第１の実施形態に係る計算機システム全体の概略構成の一例を示すブロック図。
【図２】アクセス先テーブルの一例を示す図。
【図３】Ｊａｖａプログラム内部のデータフローログの生成処理のフローチャート。
【図４】データベースからデータを読み込む場合のデータフローログの生成処理のフローチャート。
【図５】バインド一時保存部に保存される内容の一例を示す図。
【図６】バインド一時保存部へのデータ記録処理のフローチャート。
【図７】データベースへデータを書き込む場合のデータフローログの生成処理のフローチャート。
【図８】一時ログテーブルの内容の一例を示す図。
【図９】第２の実施形態に係る計算機システム全体の概略構成の一例を示すブロック図。
【図１０】アクセス先ファイル名一時保存部に保存された情報の一例を示す図。
【図１１】ファイルからデータを読み込む場合のデータフローログの生成処理のフローチャート。
【図１２】ファイルへデータを書き込む場合のデータフローログの生成処理のフローチャート。
【図１３】第３の実施形態に係る計算機システム全体の概略構成の一例を示すブロック図。
【図１４】第３の実施形態に係るＪａｖａプログラム内部のデータフローログの生成処理のフローチャート。
【図１５】第３の実施形態に係るＪａｖａプログラム同士間のデータフローログの生成処理のフローチャート。
【図１６】本発明の一実施形態におけるハードウェア構成の一例を示すブロック図。
【発明を実施するための形態】
【００１０】
以下、図面を参照しながら、本発明の実施形態について説明する。
【００１１】
（第１の実施形態）
図１は、第１の実施形態に係る計算機システム全体の概略構成の一例を示すブロック図である。第１の実施形態に係る計算機システムは、プログラムによるプロセス１と、リレーショナルデータベース（Ｒｅｌａｔｉｏｎａｌ  Ｄａｔａｂａｓｅ：ＲＤＢ）２と、ログ受信部３とを備える。
【００１２】
第１の実施形態に係る計算機システムは、第１コンポーネントであるプロセス（プログラム）１により、所定の手続きが実施されることを想定する。そして、所定の手続きが実施されるにあたり、様々なデータの授受（やり取り）が行われる。ここでは、データの授受の流れをデータフローと称する。なお、この授受されるデータは特に限定されるものではない。また、例えば、データの転送だけでなく、プログラム内のオブジェクトが別のオブジェクトを生成するといった事象もデータフローに含まれる。
【００１３】
ここでは、プログラムにＪａｖａ（登録商標）が用いられることを想定し、以降は、Ｊａｖａプログラム１として説明する。なお、Ｊａｖａプログラム１と同機能を有するオブジェクト指向プログラムなど、Ｊａｖａ以外のプログラムを用いてもよい。
【００１４】
Ｊａｖａプログラム１は、データフローが記録されたログを生成する。このログをデータフローログと称する。データフローログには、データフローの始点または終点を示す情報（位置情報）が含まれる。このようなデータフローログが生成されることにより、データフローの監視を行うことができる。
【００１５】
第１の実施形態に係る計算機システムでは、Ｊａｖａプログラム１内部のデータフローと、Ｊａｖａプログラム１とＲＤＢ２間のデータフローが起こり得る。ゆえに、下記３種類のデータフローに係るデータフローログが生成される。
（１）Ｊａｖａプログラム１内部のデータフロー
（２）Ｊａｖａプログラム１がＲＤＢ２からデータを読み込むデータフロー
（３）Ｊａｖａプログラム１からＲＤＢ２へデータを書き込むデータフロー
（２）と（３）のデータフローログにより、データフローが第１コンポーネントと別のコンポーネント（第２コンポーネント）を横断する場合においても、網羅的に監視を行うことができる。
【００１６】
次に、Ｊａｖａプログラム１について説明する。図１に示すＪａｖａプログラム１は、Ｊａｖａオブジェクト１０１および１０２と、Ｓｙｓｔｅｍクラス１０３と、Ｌｏｇｇｅｒオブジェクト１０４と、ＪＤＢＣ（Ｊａｖａ  Ｄａｔａｂａｓｅ  Ｃｏｎｎｅｃｔｉｖｉｔｙ）ドライバと、Ｌｏｇｇｅｒフック１０７と、バインド一時保存部１０５とを有する。
【００１７】
Ｊａｖａオブジェクトは、所定の手続きを実行するために生成されるオブジェクトであり、Ｊａｖａプログラム内でデータを保持する単位である。Ｊａｖａオブジェクト間において、データの授受が行われることで、Ｊａｖａプログラムが動作する。
【００１８】
図１に示されるＪａｖａオブジェクト１０１とＪａｖａオブジェクト１０２との間の矢印は、上記（１）のＪａｖａプログラム１内部のデータフローを意味する。また、Ｊａｖａオブジェクト１０２とＲＤＢ２との矢印は、上記（２）と（３）のＪａｖａプログラム１とＲＤＢ２間のデータフローを意味する。
【００１９】
なお、用いられるＪａｖａオブジェクトは手続きごとに異なる。用いられるＪａｖａオブジェクトは、後述する手続きの説明ごとに紹介する。
【００２０】
Ｓｙｓｔｅｍクラス１０３は、Ｊａｖａオブジェクトそれぞれに対してオブジェクト識別子を与え、当該オブジェクト識別子を管理する。本実施形態では、オブジェクト識別子は、データの授受が行われたＪａｖａオブジェクトを識別するために用いられる。すなわち、オブジェクト識別子は、データフローの始点または終点を示すために用いられる。
【００２１】
Ｌｏｇｇｅｒオブジェクト１０４は、Ｊａｖａプログラム１内部のデータフローを監視する。また、Ｌｏｇｇｅｒオブジェクト１０４は、後述するＬｏｇｇｅｒフック１０７を生成し、Ｊａｖａプログラム１とＲＤＢ２との間のデータフローを監視する。さらに、Ｌｏｇｇｅｒオブジェクト１０４は、データフローログを生成し、データフローログをログ受信部３に送る。
【００２２】
バインド一時保存部１０５は、Ｌｏｇｇｅｒオブジェクト１０４がデータフローログを生成する際に必要なデータを一時的に保存する。
【００２３】
ＪＤＢＣドライバ１０６は、Ｊａｖａプログラム１とＲＤＢ２との間のデータの授受に係る通信を行う。また、ＪＤＢＣドライバ１０６は、データフローログを生成するために必要な情報をＲＤＢ２から取得するための通信を行う。
【００２４】
Ｌｏｇｇｅｒフック１０７は、Ｌｏｇｇｅｒオブジェクト１０４により生成され、ＪＤＢＣドライバ１０６に接続される。これにより、Ｊａｖａプログラム１とＲＤＢ２との間のデータフローは全てＬｏｇｇｅｒフック１０７を経由することになる。そして、Ｌｏｇｇｅｒフック１０７がＪａｖａプログラム１とＲＤＢ２との間のデータフローを検知することにより、Ｊａｖａプログラム１とＲＤＢ２との間のデータフローを網羅することができる。
【００２５】
次に、ＲＤＢ２について説明する。ＲＤＢ２は、データベースインタフェース（Ｄａｔａｂａｓｅ  Ｉｎｔｅｒｆａｃｅｒ：ＤＢ＿Ｉ／Ｆ）２０１、アクセス先テーブル２０２、システムカタログ２０３、一時ログテーブル２０４を有する。
【００２６】
ＤＢ＿Ｉ／Ｆ２０１はＪａｖａプログラム１に対して公開されるデータベースの操作インタフェースである。ＪＤＢＣドライバ１０６とＤＢ＿Ｉ／Ｆ２０１とが通信を行うことにより、Ｊａｖａプログラム１とＲＤＢ２間においてデータの授受が行われる。
【００２７】
アクセス先テーブル２０２は、Ｊａｖａプログラム１が実行する所定の手続きにおいて、Ｊａｖａオブジェクト１０２からアクセスされるテーブルである。図２は、アクセス先テーブル２０２の一例を示す図である。ここでは、アクセス先テーブル２０２が図２の構造から成ることを想定して、説明する。なお、図２に示されていない情報が含まれていてもよい。
【００２８】
アクセス先テーブル２０２は、ｓａｍｐｌｅ＿ｓｃｈｅｍａというスキーマ名と、ｓａｍｐｌｅ＿ｔａｂｌｅというテーブル名をもつとする。ｓａｍｐｌｅ＿ｔａｂｌｅには、ｓｉｇｎａｌ＿ｉｄと、ｈｉｓｔｏｒｙ＿ｔｉｍｅと、ｓｉｇｎａｌ＿ｖａｌｕｅとの３つの列をもつ。ここでは、ｓｉｇｎａｌ＿ｉｄとｈｉｓｔｏｒｙ＿ｔｉｍｅのペア（組み合わせ）を、テーブルに含まれる行を一意に特定するための主キーとする。
【００２９】
システムカタログ２０３は、ＲＤＢ２内の全テーブル（アクセス先テーブル２０２を含む）に関する情報を保持するテーブルである。
【００３０】
一次ログテーブルは、アクセス先テーブル２０２へのデータ書き込みに対するログを一時的に保存するためのテーブルである。
【００３１】
次に、ログ受信部３について説明する。ログ受信部３は、生成されたデータフローログを受け取る。データフローログの送受信は、ＴＣＰ／ＩＰ通信など任意の通信手段を用いればよい。ログ受信部３は、後にデータフローログが分析されるために、データフローログを保存しておいてもよいし、他のシステムなどに出力してもよい。
【００３２】
なお、図１において、ログ受信部３はＪａｖａプログラム１外部にあるとしたが、Ｊａｖａプログラム１の内部にあってもよいし、ＲＤＢ２の内部にあってもよい。
【００３３】
次に、上記３種類のデータフローのデータフローログを生成するための具体的な記録方法について説明する。
（１）Ｊａｖａプログラム１の内部のデータフロー
Ｊａｖａプログラム１内部のデータフローには、図１に示すように、Ｊａｖａオブジェクト１０１からＪａｖａオブジェクト１０２へのデータ転送、または、Ｊａｖａオブジェクト１０１によるＪａｖａオブジェクト１０２の生成といった事象などがある。例えば、下記に示されるコードは、Ｊａｖａプログラム１の内部のデータフローを生ずる。
Object copied_data = original_data.clone()
Object processed_data = processData (copied_data)
１行目において、ｏｒｉｇｉｎａｌ＿ｄａｔａオブジェクトからｃｏｐｉｅｄ＿ｄａｔａオブジェクトへのデータフローが発生していると言える。この場合、ｏｒｉｇｉｎａｌ＿ｄａｔａオブジェクトがＪａｖａオブジェクト１０１であり、ｃｏｐｉｅｄ＿ｄａｔａオブジェクトがＪａｖａオブジェクト１０２と言える。また、２行目においてｃｏｐｉｅｄ＿ｄａｔａオブジェクトからｐｒｏｃｅｓｓｅｄ＿ｄａｔａオブジェクトへのデータフローが発生していると言える。
【００３４】
上記のように、Ｊａｖａプログラム１内部にてデータフローが発生した場合に、データフローの始点であるＪａｖａオブジェクト１０１とデータフローの終点であるＪａｖａオブジェクト１０２が、Ｌｏｇｇｅｒオブジェクト１０４に渡されることにより、Ｌｏｇｇｅｒオブジェクト１０４はデータフローの発生を検知することができる。
【００３５】
より詳細に説明すると、Ｊａｖａオブジェクト１０１および１０２は、Ｌｏｇｇｅｒオブジェクト１０４に対するｆｌｏｗメソッドの呼び出しにより、Ｌｏｇｇｅｒオブジェクト１０４に渡される。上記の２つのデータフローに対するｆｌｏｗメソッドの呼び出しは、下記のようなコードになる。
logger.flow(original_data,copied_data)
logger.flow(copied_data, processed_data)
上記コードのｌｏｇｇｅｒがＬｏｇｇｅｒオブジェクト１０４を意味する。ｌｏｇｇｅｒ．ｆｌｏｗによりｆｌｏｗメソッドが呼び出され、カッコ内のオブジェクトがＬｏｇｇｅｒオブジェクト１０４に渡される。上記コードの例では、括弧内の１番目がデータフローの始点であるＪａｖａオブジェクト１０１、括弧内の２番目がデータフローの終点であるＪａｖａオブジェクト１０２として、Ｌｏｇｇｅｒオブジェクト１０４に渡される。
【００３６】
データフローの発生を検知したＬｏｇｇｅｒオブジェクト１０４は、当該データフローのデータフローログを生成する。図３は、Ｊａｖａプログラム内部のデータフローログの生成処理のフローチャートである。本フローは、前述のように、ｆｌｏｗメソッドが呼び出された時点で開始される。
【００３７】
Ｌｏｇｇｅｒオブジェクト１０４は、まず、Ｓｙｓｔｅｍクラス１０３のｉｄｅｎｔｉｆｙＨａｓｈＣｏｄｅメソッドを呼び出し、Ｊａｖａオブジェクト１０１および１０２のオブジェクト識別子を取得する（Ｓ１０１とＳ１０２）。次に、Ｌｏｇｇｅｒオブジェクト１０４は、取得した両識別子に基づき、データフローログを生成する（Ｓ１０３）。生成されたデータフローログは、ログ受信部３に送られる（Ｓ１０４）。ログの送信は、ＴＣＰ／ＩＰ通信など任意の通信手段を用いればよい。以上が、データフローログの生成処理のフローである。
【００３８】
なお、本フローチャートは一例であり、これに限られるものではない。例えば、Ｓ１０１とＳ１０２の順番は異なっていてもよい。以降に説明される各実施形態におけるフローチャートも同様である。
【００３９】
データフローログは、例えば、ＪＳＯＮ（ＪａｖａＳｃｒｉｐｔ（登録商標）  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎ）形式のテキストデータとして、生成される。下記にＪＳＯＮ形式のテキストデータとして生成されたデータフローログの一例を示す。
{
“src”:{
“type”:“java_internal”,
“object_hash”:“1487365346”
},
“dst”:{
“type”:“java_internal”,
“object_hash”:“1786281489”
},
“time”:“1439172160987”
}
ｓｒｃにはデータフローの始点に関する情報を示す。ｄｓｔは、データフローの終点に関する情報を示す。ｓｒｃおよびｄｓｔに含まれているｔｙｐｅフィールドは、コンポーネントの種類を示す。ｔｙｐｅフィールドの値ｊａｖａ＿ｉｎｔｅｒｎａｌは、Ｊａｖａオブジェクトを意味する。また、ｏｂｊｅｃｔ＿ｈａｓｈフィールドは、オブジェクトの識別子を示す。ゆえに、上記データフローログから、データフローの始点のＪａｖａオブジェクトおよび終点のＪａｖａオブジェクトを分析することができる。また、ｔｉｍｅフィールドは、データフローログが生成された時刻を示す。
【００４０】
なお、データフローログには、上記の情報の他にも様々な情報を含めてもよい。例えば、Ｊａｖａプログラム１が動作している計算機のホスト名、Ｊａｖａプログラム１のプロセスＩＤ、Ｊａｖａプログラム１のスレッドＩＤ、始点もしくは終点のＪａｖａオブジェクトのクラス名、ｆｌｏｗメソッドを呼び出すコードのファイル名と当該ファイル内の行番号、またはｆｌｏｗメソッドを呼び出すクラス名とメソッド名などの情報が、データフローログに含まれていてもよい。
【００４１】
このように、Ｌｏｇｇｅｒオブジェクト１０４は、Ｓｙｓｔｅｍクラス１０３から、データフローの始点を示すオブジェクト識別子と、データフローの終点を示すオブジェクト識別子を取得する。そして、Ｌｏｇｇｅｒオブジェクト１０４は、両オブジェクト識別子が記録されたデータフローログを生成する。これにより、生成されたデータフローログに基づきＪａｖａプログラムの内部のデータフローを監視することができる。
【００４２】
（２）Ｊａｖａプログラム１がＲＤＢ２からデータを読み込むデータフロー
Ｊａｖａプログラム１がＲＤＢ２からデータを読み込むデータフローは、例えば、図１に示すように、Ｊａｖａオブジェクト１０２が、ＲＤＢ２のアクセス先テーブル２０２からデータを取得するといったものがある。Ｊａｖａプログラム１とＲＤＢ２との間のデータフローに関する情報は、Ｌｏｇｇｅｒフック１０７により集められる。
【００４３】
Ｌｏｇｇｅｒフック１０７は、ＪＤＢＣドライバ１０６に接続される追加機能である。Ｌｏｇｇｅｒフック１０７は、例えば、ｊａｖａ．ｌａｎｇ．ｒｅｆｌｅｃｔ．Ｐｒｏｘｙクラスの機能を用いて実現可能である。そして、Ｌｏｇｇｅｒオブジェクト１０４は、下記に示すコードのように、ｗｒａｐメソッドを呼び出し、ＪＤＢＣドライバ１０６にＬｏｇｇｅｒフック１０７をラップ（接続）しておく。
connection=logger.wrap(connection)
ｃｏｎｎｅｃｔｉｏｎは、ＪＤＢＣドライバ１０６の一部であるｊａｖａ．ｓｑｌ．Ｃｏｎｎｅｃｔｉｏｎ型のオブジェクトである。ｗｒａｐメソッドは、与えられたｃｏｎｎｅｃｔｉｏｎにＬｏｇｇｅｒフック１０７を接続し、その結果を戻り値として返す。これにより、ｃｏｎｎｅｃｔｉｏｎにＬｏｇｇｅｒフック１０７が接続され、ｃｏｎｎｅｃｔｉｏｎおよびｃｏｎｎｅｃｔｉｏｎから生成されるオブジェクトに対して実施される操作は、全てＬｏｇｇｅｒフックにより監視される。
【００４４】
ＪＤＢＣドライバ１０６を用いてＲＤＢ２からデータを読み込む場合、主にＲｅｓｕｌｔＳｅｔオブジェクトが用いられる。Ｌｏｇｇｅｒフック１０７は、このＲｅｓｕｌｔＳｅｔオブジェクトに対するデータの読み込む操作を検出する。そして、検出の通知を受けたＬｏｇｇｅｒオブジェクト１０４が、検出されたデータの読み込む操作に係るデータフローログを生成する。
【００４５】
下記は、ＲｅｓｕｌｔＳｅｔオブジェクトを用いたデータの読み込みのコードの一例である。下記のコードでは、９行目に示されたｒｓ．ｇｅｔＯｂｊｅｃｔメソッドによりＲＤＢ２のデータが読み込まれるため、ｒｓ．ｇｅｔＯｂｊｅｃｔメソッドが呼び出された時点でＬｏｇｇｅｒフック１０７がデータフローを検出する。
PreparedStatement ps = connection.prepareStatement(
“SELECT signal_id, history_value, signal_value”
+“FROM sample_schema.sample_table”
+“WHERE signal_id = ? ORDER BY history_time ASC LIMIT 1”
);
ps.setInt(1,1);
ResultSet rs = ps.executeQuery();
while(rs.next()){
Double value = (Double)rs.getObject(“signal_value”);
}
【００４６】
なお、上記コードにおいて、データの読み込み先であるＪａｖａオブジェクト１０２は、ＲｅｓｕｌｔＳｅｔオブジェクトではなく、ＲｅｓｕｌｔＳｅｔオブジェクトに対してｇｅｔＯｂｊｅｃｔなどのデータ読み込みメソッドを呼び出した結果、戻り値として得られるものである。
【００４７】
図４は、データベースからデータを読み込む場合のデータフローログの生成処理のフローチャートである。このフローは、前述のとおり、ＲｅｓｕｌｔＳｅｔオブジェクトがｇｅｔＯｂｊｅｃｔまたはｇｅｔＳｔｒｉｎｇなどのデータ読み込みメソッドを呼び出した時点にて開始される。
【００４８】
Ｌｏｇｇｅｒフック１０７は、ＲｅｓｕｌｔＳｅｔオブジェクトを生成したＣｏｎｎｅｃｔｉｏｎオブジェクトの自動コミット設定を確認し、自動コミット設定が有効であった場合は自動コミット設定を無効にする（Ｓ２０１）。自動コミット設定を無効にするのは、正確なデータフローログを生成するためである。
【００４９】
自動コミット設定の無効化は、Ｃｏｎｎｅｃｔｉｏｎオブジェクトに対しｇｅｔＡｕｔｏＣｏｍｍｉｔメソッドを呼び出して、自動コミット設定を調べた上で、ｓｅｔＡｕｔｏＣｏｍｍｉｔメソッドを呼び出すことにより実現される。詳細は後述する。
【００５０】
次に、Ｊａｖａオブジェクト１０２により、ＲＤＢ２からデータが読み込まれる（Ｓ２０２）と、Ｌｏｇｇｅｒフック１０７がＲｅｓｕｌｔＳｅｔオブジェクトを用いて、読み込まれたデータが保管されていたＲＤＢ２の場所（位置）を示す情報を取得する（Ｓ２０３からＳ２０５）。ＲＤＢ２の場所（位置）を示す情報は、データベース名、カタログ名、スキーマ名、テーブル名、列の名称、およびテーブルの主キーの名称と値である。ここでは、これらの情報をデータベース関連情報と称する。テーブルの主キーの名称と値が含まれることにより、ＲＤＢ２のアクセス先テーブル２０２の何行目にデータが書き込まれているかを認識することができる。
【００５１】
まず、Ｌｏｇｇｅｒフック１０７はデータベース名を取得する（Ｓ２０３）。データベース名は、接続先のＲＤＢ２を示すＵＲＬ文字列を取得することにより、取得することができる。ＵＲＬ文字列は、ｒｓ．ｇｅｔＳｔａｔｅｍｅｎｔ（）．ｇｅｔＣｏｎｎｅｃｔｉｏｎ（）．ｇｅｔＭｅｔａＤａｔａ（）．ｇｅｔＵＲＬ（）メソッドを呼び出すことにより取得することができる。なお、ｒｓは上記コードの６行目にて示すように、ＲｅｓｕｌｔＳｅｔオブジェクトを意味する。
【００５２】
次に、Ｌｏｇｇｅｒフック１０７は、カタログ名、スキーマ名、テーブル名、列名を取得する（Ｓ２０４）。これらの名称は、ｒｓ．ｇｅｔＭｅｔａＤａｔａ（）により取得したＲｅｓｕｌｔＳｅｔＭｅｔａＤａｔａ型オブジェクトに対し、それぞれｇｅｔＣａｔａｌｏｇＮａｍｅ、ｇｅｔＳｃｈｅｍａＮａｍｅ、ｇｅｔＴａｂｌｅＮａｍｅ、ｇｅｔＣｏｌｕｍｎＮａｍｅメソッドを実施することにより、取得することができる。
【００５３】
次に、Ｌｏｇｇｅｒフック１０７は、テーブルの主キーの名称を取得する（Ｓ２０５）。主キーの名称は、取得したカタログ名、スキーマ名、テーブル名を、ｒｓ．ｇｅｔＳｔａｔｅｍｅｎｔ（）．ｇｅｔＣｏｎｎｅｃｔｉｏｎ（）．ｇｅｔＭｅｔａＤａｔａ（）．ｇｅｔＰｒｉｍａｒｙＫｅｙｓ（）メソッドの引数として渡すことにより、取得することができる。その後、Ｌｏｇｇｅｒフック１０７は、ＲｅｓｕｌｔＳｅｔオブジェクトｒｓに含まれるデータのうち、列名が主キーに含まれるものの値を取得し、主キーの名称と値のペアとして記憶する（Ｓ２０６）。
【００５４】
なお、Ｓ２０３からＳ２０５の処理において実行されたメソッドは、ＲｅｓｕｌｔＳｅｔオブジェクトを介して、最終的にＲＤＢ２のシステムカタログ２０３へ問い合わせを行うものである。
【００５５】
Ｌｏｇｇｅｒフック１０７が取得したこれらのデータベース関連情報は、Ｌｏｇｇｅｒオブジェクト１０４に渡され、Ｌｏｇｇｅｒフック１０７は、Ｃｏｎｎｅｃｔｉｏｎの自動コミット設定を無効化した場合は有効化する（Ｓ２０７）。Ｌｏｇｇｅｒオブジェクト１０４は、取得したデータの読み込み先であるＪａｖａオブジェクト１０２のオブジェクト識別子をＳｙｓｔｅｍクラス１０３から取得する（Ｓ２０８）。
【００５６】
Ｌｏｇｇｅｒオブジェクト１０４は、Ｌｏｇｇｅｒフック１０７から取得したデータベース関連情報と、Ｓｙｓｔｅｍクラス１０３から取得したオブジェクト識別子とを用いて、データフローログを生成する（Ｓ２０９）。Ｌｏｇｇｅｒオブジェクト１０４は生成したデータフローログをログ受信部３に送信する（Ｓ２１０）。以上が、ＲＤＢ２からデータを読み込む場合のデータフローログの生成処理のフローである。
【００５７】
Ｌｏｇｇｅｒフック１０７がＣｏｎｎｅｃｔｉｏｎの自動コミット設定を無効化した理由は、ＲｅｓｕｌｔＳｅｔオブジェクトからのデータの読み込みと、その後のＬｏｇｇｅｒフック１０７からのシステムカタログ２０３への問い合わせが同一のトランザクションにて実行されるためである。これらの処理が別々のトランザクションにて実施されると、ＲｅｓｕｌｔＳｅｔからデータを読み込んだ直後に、別のプログラムがＲＤＢ２に命令を実行すると、問題が生ずる可能性がある。例えば、別のプログラムがＲＤＢ２にテーブル名の変更命令を行った後にシステムカタログ２０３から情報を読み込むと、当該情報がＲｅｓｕｌｔＳｅｔから読み込んだデータを正しく表現できなくなる。ゆえに、自動コミット設定を操作して、同一のトランザクションにて各処理を実行させることにより、上記のような問題が生じず、常に正しい情報をシステムカタログ２０３から取得できる。
【００５８】
なお、上記では、Ｃｏｎｎｅｃｔｉｏｎの自動コミット設定を操作したが、同様にｇｅｔＴｒａｎｓａｃｔｉｏｎＩｓｏｌａｔｉｏｎメソッドとｓｅｔＴｒａｎｓａｃｔｉｏｎＩｓｏｌａｔｉｏｎメソッドを用いてトランザクション分離レベルを一時的に操作してもよい。例えば、トランザクション分離レベルを一時的に最も強い分離レベルであるＴＲＡＮＳＡＣＴＩＯＮ＿ＳＥＲＩＡＬＩＺＡＢＬＥにすることにより、しないときよりも確実に正しいデータフローログを取得できるようになる。
【００５９】
下記は、生成されたデータフローログの一例である。当該データフローログは、図２に示したアクセス先テーブル２０２における上から２番目の行（列名の行を除く）のｓｉｇｎａｌ＿ｖａｕｅ列（値は１００．４）をＪａｖａオブジェクト１０２が読み込んだ際のデータフローログである。
{
“src”: {
“type”:“rdb”,
“db_name”:“sample_db”,
“db_catalog”:“”,
“db_schema”:“sample_schema”,
“db_table”:“sample_table”,
“db_pk_signal_id”:“1”,
“db_pk_history_time”:“2015-09-07 10:05:48.392+09:00”,
“db_column”:“signal_value”
},
“dst”: {
“type”:“java_internal”,
“object_hash”:“337422011”
},
“time”:“1439172160332”
}  
【００６０】
データフローログの２行目から示されているｓｒｃフィールドには、データフローの始点に関する情報が含まれている。ここでは、データフローの始点はＲＤＢ２内であり、ｓｒｃフィールドには、ＲＤＢ２内におけるデータの記録場所（カタログ名、スキーマ名、テーブル名、列の名前）などのデータベース関連情報が含まれる。
【００６１】
ｓｒｃフィールド中のｔｙｐｅフィールドの値“ｒｄｂ”はデータベースを表している。ｄｂ＿ｎａｍｅ、ｄｂ＿ｃａｔａｌｏｇ、ｄｂ＿ｓｃｈｅｍａ、ｄｂ＿ｔａｂｌｅ、ｄｂ＿ｃｏｌｕｍｎはそれぞれデータベース名、カタログ名、スキーマ名、テーブル名、列の名前を示す。例えば、データベース名は、ｓａｍｐｌｅ＿ｄｂである。
【００６２】
ｄｂ＿ｐｋ＿ｓｉｇｎａｌ＿ｉｄフィールドとｄｂ＿ｐｋ＿ｈｉｓｔｏｒｙ＿ｔｉｍｅフィールドは、ｓａｍｐｌｅ＿ｔａｂｌｅの主キーを構成するペアである。このように、主キーがログに記録されているために、データが格納されていたアクセス先テーブル２０２の行まで特定することができる。ｔｉｍｅフィールドはこのデータフローログが生成された時刻である。
【００６３】
データフローログの１３行目から示されているｄｓｔフィールドには、データフローの終点に関する情報が含まれている。ここでは、データフローの終点はＪａｖａオブジェクト１０２である。ｄｓｔフィールド中の各フィールドは、前述のＪａｖａプログラム１の内部のデータフローと同じである。
【００６４】
なお、データフローログには、上記で述べた情報の他にも様々な情報を含めてよい。例えば、ＲＤＢ２に関するＩＰアドレス、待ち受けポート番号、または製品名およびそのバージョン番号などをデータフローログに含めてよい。また、ＲＤＢ２にアクセスした際のトランザクションＩＤ、読み込み対象の行に対してＲＤＢ２が割り振っている行ＩＤ、読み込み対象の行の主キー以外の列の値などもデータフローログに含めてもよい。
【００６５】
また、図４に示したＳ２０６の処理において、Ｌｏｇｇｅｒフック１０７はＲｅｓｕｌｔＳｅｔオブジェクトから主キーの値を取得するが、一般に、ＲｅｓｕｌｔＳｅｔオブジェクト内に読み込む対象のテーブルの主キーが全て含まれているとは限らない。そこで、ＲｅｓｕｌｔＳｅｔオブジェクト内に主キーの値が含まれることを保証するために、Ｊａｖａプログラム１がデータ読み込み命令（ＳＱＬにおけるＳＥＬＥＣＴ文）をＲＤＢ２へ発行したときは、Ｌｏｇｇｅｒフック１０７が当該データ読み込み命令を捕捉・解析を行い、読み込み対象のテーブルの主キーとともに読み込みを行うように、当該データ読み込み命令を書き換えた上で、ＲＤＢ２へ送信するようにしてもよい。読み込み命令の補足は、ＪＤＢＣにおけるＣｏｎｎｅｃｔｉｏｎクラス、Ｓｔａｔｅｍｅｎｔクラス、ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔクラスなどへのメソッド呼び出しを監視することで実現できる。これにより、Ｊａｖａプログラム１がＲＤＢ２から読み込むデータを問わず、正確なデータフローログを記録することができる。
【００６６】
このように、Ｌｏｇｇｅｒオブジェクト１０４が、Ｓｙｓｔｅｍクラス１０３からデータフローの始点を示すオブジェクト識別子を取得する。また、Ｌｏｇｇｅｒフック１０７がＲＤＢ２に問い合わせを行うことにより、データフローの終点を示すデータベース関連情報を取得する。そして、Ｌｏｇｇｅｒオブジェクト１０４は、データフローの始点を示す情報および終点を示す情報が記録されたデータフローログを生成する。これにより、生成されたデータフローログに基づき、Ｊａｖａプログラム１がＲＤＢ２からデータを読み込むデータフローを監視することができる。
【００６７】
（３）Ｊａｖａプログラム１からＲＤＢ２へデータを書き込むデータフロー
Ｊａｖａプログラム１からＲＤＢ２へデータを書き込む場合も、Ｊａｖａプログラム１がＲＤＢ２からデータを読み込む場合と同様、データフローに関する情報は、Ｌｏｇｇｅｒフック１０７により集められる。
【００６８】
ＪＤＢＣドライバ１０６を用いてＲＤＢ２へデータを書き込む場合、主にＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトが用いられる。Ｌｏｇｇｅｒフック１０７は、このＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトによるデータの書き込む操作を検出する。
【００６９】
下記は、ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトを用いたデータの書き込みコードの一例である。
PreparedStatement ps = connection.prepareStatement(
“UPDATE sample_schema.sample_table”
+ “SET signal_value = ?”
+ “WHERE signal_id = ?”
);
ps.setObject(1, write_value);
ps.setInt(2, 2);
ps.execute();
【００７０】
上記に示されたデータの書き込みコードは、３つの手続きから構成されている。まず、１行目に示すように、（i）ｃｏｎｎｅｃｔｉｏｎ．ｐｒｅｐａｒｅＳｔａｔｅｍｅｎｔにより、ＲＤＢ２に対するＳＱＬ命令を有するＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトが生成される。上記コードでは、３行目から５行目がＳＱＬ命令である。次に、６と７行目に示すように、（ii）ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔに対してＪａｖａオブジェクト１０２およびパラメータがバインドされる。そして、８行目に示すように、（iii）ｐｓ．ｅｘｅｃｕｔｅにより、データがＲＤＢ２に書き込まれる。
【００７１】
上記（ii）の手続きは、ＲＤＢ２へ発行するＳＱＬ命令内のプレースホルダーに対し、Ｊａｖａオブジェクト１０２を対応付ける（バインドする）ものである。これにより、Ｊａｖａプログラム１はデータをＲＤＢ２へ書き込むことができる。
【００７２】
なお、上記コードにおいて、データの書き込み元であるＪａｖａオブジェクト１０２は、ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトではなく、ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトにバインドされたほうである。
【００７３】
上記コードにおけるデータフローログの生成処理は、３つの処理に分けられる。まず上記（i）の手続きが行われると、Ｌｏｇｇｅｒフック１０７は、バインド一時保存部１０５に、データ書き込みに係る情報を格納する処理を行う。次に、上記（ii）の手続きが行われると、Ｌｏｇｇｅｒフック１０７は、バインドされたＪａｖａオブジェクト１０２の識別子を取得し、バインド一時保存部１０５に格納したデータと対応付ける。そして、上記（iii）の手続きが行われると、Ｌｏｇｇｅｒフック１０７は、データが書き込まれたアクセス先テーブル２０２の行を判別するための主キーの情報を取得する。そして、Ｌｏｇｇｅｒオブジェクトがデータフローログを生成する。
【００７４】
図５は、バインド一時保存部１０５に保存される内容の一例を示す図である。バインド一時保存部１０５は、ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトと、ＲＤＢ２内のアクセス先テーブル２０２の情報（カタログ名、スキーマ名、テーブル名、列の名前）と、プレースホルダーインデックスと、バインドオブジェクトとの４種のデータを相互に対応付けて管理するためのデータ構造を有する。
【００７５】
ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクト識別子は、ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトの識別子である。プレースホルダーインデックスは、プレースホルダーがＳＱＬ命令内に現れる順序番号である。バインドオブジェクト識別子は、バインドされたＪａｖａオブジェクト１０２の識別子である。
【００７６】
一般に、Ｊａｖａプログラム１からＲＤＢ２へのデータ書き込みでは、ＳＱＬ命令内に書き込み先の列の名前と書き込むデータを表すプレースホルダーが記される。例えば、上記コードでは、“ｓｉｇｎａｌ＿ｖａｌｕｅ  ＝  ？”という文字列が、列の名前である“ｓｉｇｎａｌ＿ｖａｌｕｅ”とプレースホルダーである“？”の組を表している。
【００７７】
上記のｓｉｇｎａｌ＿ｖａｌｕｅとペアになるプレースホルダーの場合、ＳＱＬ命令内の最初のプレースホルダーであるため、そのインデックスは１である。ゆえに、図５の１行目のプレースホルダーインデックスに１が格納されている。一般に、１つのＳＱＬ命令内には、列の名前とプレースホルダーインデックスのペアが複数存在する。その場合はペアごとに別々の行がバインド一時保存部１０５に生成される。
【００７８】
バインド一時保存部１０５は、Ｊａｖａプログラム１のメモリ上に確保されてもよいし、ＲＤＢ２上に確保されてもよいし、その他の任意の記憶領域に確保されてもよい。なお、バインド一時保存部１０５に保存される各データ（各行）は、該当するＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトが用いられなくなった時点で削除してもよい。
【００７９】
図６は、バインド一時保存部１０５へのデータ記録処理のフローチャートである。バインド一時保存部１０５への記録は、上記（i）のｃｏｎｎｅｃｔｉｏｎ．ｐｒｅｐａｒｅＳｔａｔｅｍｅｎｔメソッドの実行時に行われる処理と、（ii）のＪａｖａオブジェクト１０２のバインドの実行時に行われる処理との２段階に分けて実施される。図６（Ａ）に、（i）のｃｏｎｎｅｃｔｉｏｎ．ｐｒｅｐａｒｅＳｔａｔｅｍｅｎｔメソッドの実行時に行われる処理のフローを、図６（Ｂ）に、（ii）のＪａｖａオブジェクト１０２のバインド時に行われる処理のフローを示す。
【００８０】
まず、図６（Ａ）に示すｐｒｅｐａｒｅＳｔａｔｅｍｅｎｔメソッドの実行時に行われる処理について述べる。本フローは、Ｊａｖａプログラム１がＣｏｎｎｅｃｔｉｏｎオブジェクトに対するｐｒｅｐａｒｅＳｔａｔｅｍｅｎｔメソッド呼び出しを実行したときに開始される。Ｌｏｇｇｅｒフック１０７は、ｐｒｅｐａｒｅＳｔａｔｅｍｅｎｔメソッドの戻り値であるＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトを取得する（Ｓ３０１）。次に、Ｌｏｇｇｅｒフック１０７がＳＱＬ命令文字列を解析し、書き込み先のカタログ名、スキーマ名、テーブル名、およびプレースホルダーインデックス、と対応する列の名前のペアを取得する（Ｓ３０２）。これにより、バインド一時保存部１０５のデータ構造のうちバインドオブジェクト識別子以外の情報が取得される。Ｌｏｇｇｅｒフック１０７は、取得したこれらの情報をバインド一時保存部１０５に記録する（Ｓ３０３）。
【００８１】
なお、ＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクト識別子は、Ｓｙｓｔｅｍクラス１０３から取得することができる。
【００８２】
次に、図６（Ｂ）に示すＪａｖａオブジェクト１０２のバインド時に行われる処理について述べる。本フローは、Ｊａｖａプログラム１がＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトに対するｓｅｔＯｂｊｅｃｔなどのメソッド呼び出しを実行したときに開始される。Ｌｏｇｇｅｒフック１０７は、ｓｅｔＯｂｊｅｃｔなどのメソッドに引数として与えられるプレースホルダーインデックスおよびバインドされるＪａｖａオブジェクト１０２、並びに、メソッドが呼ばれたＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトのオブジェクト識別子を取得する（Ｓ４０１）。Ｌｏｇｇｅｒフック１０７は、プレースホルダーインデックスとＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクト識別子に基づき、バインド一時保存部１０５の各行を検索する（Ｓ４０２）。プレースホルダーインデックスとＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクト識別子が同一の値である行が存在したときは（Ｓ４０３のＹＥＳ）、Ｌｏｇｇｅｒフック１０７は、検出した行に対し、バインドされるＪａｖａオブジェクト１０２のオブジェクト識別子をバインドオブジェクト識別子として記録する（Ｓ４０４）。プレースホルダーインデックスとＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクト識別子が同一の値である行が存在しないときは（Ｓ４０３のＮＯ）、Ｌｏｇｇｅｒフック１０７は何もせず、本フローは終了する。上記２つの手続きにより、バインド一時保存部１０５への記録が完了する。
【００８３】
図７は、データベースへデータを書き込む場合のデータフローログの生成処理のフローチャートである。このフローチャートは、前述の通り、上記（iii）のＰｒｅｐａｒｅｄＳｔａｔｅｍｅｎｔオブジェクトに対して、データ書き込み実行メソッド、例えば、ｅｘｅｃｕｔｅ、ｅｘｅｃｕｔｅＵｐｄａｔｅメソッドなどが呼び出された際に開始される。
【００８４】
まず、Ｌｏｇｇｅｒフック１０７がＣｏｎｎｅｃｔｉｏｎオブジェクトの自動コミット設定を一時的に無効化する（Ｓ５０１）。この無効化は、図４に示したＲＤＢ２からデータを読み込む場合のデータフローログの生成処理において実施されたのと同じ方法および理由による。また、Ｌｏｇｇｅｒフック１０７は、一時ログテーブル２０４の全内容を消去しておく（Ｓ５０２）。
【００８５】
そして、ＲＤＢ２に対しデータが書き込まれる（Ｓ５０３）と、アクセス先テーブル２０２に設定されたトリガーが、データ書き込み先の情報を一時ログテーブル２０４へ記録する（Ｓ５０４）。
【００８６】
本実施形態ではアクセス先テーブル２０２に予めトリガーを設定しておく。「トリガー」とは、テーブルに対して何らかの操作が実行された時に、ＲＤＢ２内で実行される手続きを意味する。ここでは、トリガーがアクセス先テーブル２０２に設定され、アクセス先テーブル２０２においてデータ書き込み操作が実行された時に起動されたトリガーが、一時ログテーブル２０４へデータ書き込み先の情報を記録するように設定しておく。なお、多くのＲＤＢ２製品はトリガーを設定・実行する機能を提供しており、当該機能を用いればよい。
【００８７】
図８は、一時ログテーブル２０４の内容の一例を示す図である。一時ログテーブル２０４は、書き込み操作が実際に行われたテーブルのカタログ名、スキーマ名、テーブル名、書き込み先の行の主キーの名称と値、および書き込み先の列の名前を保存する。一度の書き込み操作において、複数のテーブル、複数の行、または複数の列に対する書き込みが発生した場合、当該書き込みに応じた複数の行が一時ログテーブル２０４に書き込まれる。なお、書き込みが実施された列の名前などの情報は、システムカタログ２０３から適宜読み込まれ、一時ログテーブル２０４へ書き込まれる。
【００８８】
図７のフローの説明に戻る。トリガーが一時ログテーブル２０４に書き込み先のデータベース情報を書き込むと、Ｌｏｇｇｅｒフック１０７がＲＤＢ２から一時ログテーブル２０４の情報を読み取り、一時ログテーブル２０４の情報をＬｏｇｇｅｒオブジェクト１０４へ転送する（Ｓ５０５）。また、Ｌｏｇｇｅｒフック１０７がＣｏｎｎｅｃｔｉｏｎの自動コミット設定を元に戻す（Ｓ５０６）。
【００８９】
Ｌｏｇｇｅｒオブジェクト１０４は、Ｌｏｇｇｅｒフック１０７から一時ログテーブル２０４の情報を取得し（Ｓ５０７）、当該一時ログテーブル２０４の情報に基づき、バインド一時保存部１０５を検索し、バインドオブジェクト識別子を取得する（Ｓ５０８）。
【００９０】
そして、Ｌｏｇｇｅｒオブジェクト１０４は、データベース名、カタログ名、スキーマ名、テーブル名、主キーの名称と値、列の名前、およびバインドオブジェクト識別子から成るデータの組み合わせに対し、下記に示すようなデータフローログを生成する（Ｓ５０９）。データの組み合わせが複数取得されたときは、当該データの組み合わせそれぞれに対して、データフローログを生成する。
{
“src”: {
“type”:“java_internal”,
“object_hash”:“337422011”
},
“dst”: {
“type”:“rdb”,
“db_name”:“sample_db”,
“db_catalog”:“”,
“db_schema”:“sample_schema”,
“db_table”:“sample_table”,
“db_pk_signal_id”:“2”,
“db_pk_history_time”:“2015-09-07 10:10:53.334+09:00”,
“db_column”:“signal_value”
},
“time”:“1439172160332”
}  
上記データフローログのｓｒｃフィールド内にあるｏｂｊｅｃｔ＿ｈａｓｈフィールドがバインドオブジェクト識別子を示す。ｄｓｔフィールド内の各フィールドは、書き込み先のＲＤＢ２の情報を示すものであり、（２）Ｊａｖａプログラム１がＲＤＢ２からデータを読み込む場合のデータフローログと同じである。ｔｉｍｅフィールドはこのデータフローログが生成された時刻を表す。
【００９１】
Ｌｏｇｇｅｒオブジェクト１０４は、生成されたデータフローログを、ログ受信部３に送信する（Ｓ５１０）。以上が、データフローの報告処理のフローである。
【００９２】
なお、上記データフローの報告処理では、「主キーの名称と値」が用いられたが、これに代わり、ＲＤＢ２内部において各行を識別するために用いられる行ＩＤを用いてもよい。また、上記のデータフローログには、その他様々な関連情報を含めてもよい。
【００９３】
このように、Ｌｏｇｇｅｒフック１０７が、Ｓｙｓｔｅｍクラス１０３からデータフローの始点を示すバインドオブジェクト識別子を取得する。また、Ｌｏｇｇｅｒフック１０７が、バインド一時保存部１０５の情報と一時ログテーブルの情報とに基づき、データフローの終点を示すデータベース関連情報を取得する。そして、Ｌｏｇｇｅｒオブジェクト１０４は、データフローの始点を示す情報および終点を示す情報が記録されたデータフローログを生成する。これにより、生成されたデータフローログに基づき、Ｊａｖａプログラム１がＲＤＢ２へデータを書き込むデータフローを監視することができる。
【００９４】
以上のように、本実施形態によれば、（１）Ｊａｖａプログラム１内部のデータフローと、（２）Ｊａｖａプログラム１がＲＤＢ２からデータを読み込むデータフローと、（３）Ｊａｖａプログラム１からＲＤＢ２へデータを書き込むデータフローとを、統一された形式にて記録することができる。これにより、Ｊａｖａプログラム１とＲＤＢ２を横断するデータフローを詳細かつ網羅的に記録することができる。例えば、データがデータベースから読み込まれ、Ｊａｖａプログラム内部で変換され、データベースへ書き込まれ、そのデータをまた別のＪａｖａプログラムが読み出すといったデータフローも記録することができる。また、本実施形態によれば、データそのものに対し、タグなどのメタデータを付与する必要がないため、容易に実現することができる。
【００９５】
（第２の実施形態）
第１の実施形態では、Ｊａｖａプログラム１とＲＤＢ２にて構成されるシステムにおけるデータフローを記録する方法について示した。本実施形態では、Ｊａｖａプログラム１とファイルサービス４にて構成されるシステムのデータフローを記録する方法について説明する。そして、第２コンポーネントがファイルサービス４であっても、データフローが追跡可能であることを示す。なお、第１の実施形態と重複する説明は省略する。
【００９６】
図９は、第２の実施形態に係る計算機システム全体の概略構成の一例を示すブロック図である。第２の実施形態に係る計算機システムは、Ｊａｖａプログラム１のアクセス先がファイルサービス４である点が第１の実施形態と異なる。また、それに伴い、Ｊａｖａプログラム１は、ＪＤＢＣドライバ１０６の代わりにＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８を、バインド一時保存部１０５の代わりにアクセス先ファイル名一時保存部１０９を有する。
【００９７】
ファイルサービス４は、アクセス先ファイル４０１と、ファイルサービスインタフェース（Ｉ／Ｆ）４０２と、ファイルポインタ管理部４０３とを有する。ファイルサービス４は、Ｊａｖａプログラム１に対して、ファイルおよびそのファイル内部のデータの授受を行う。
【００９８】
アクセス先ファイル４０１は内部にデータを有し、Ｊａｖａプログラム１にて当該データの読み書きが行われる。ファイルサービスＩ／Ｆ４０２は、Ｊａｖａプログラム１とのファイルとデータの授受を行うためのインタフェースである。
【００９９】
ファイルポインタ管理部４０３は、ファイルポインタを管理する。ファイルポインタとは、アクセス先ファイル４０１内にて現在行われているデータの読み書きの場所（位置）を示す情報である。ファイルポインタは、ファイル先頭からのバイト数で表される。
【０１００】
一方、Ｊａｖａプログラム１のＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８は、Ｊａｖａの標準ライブラリに含まれる機能である。Ｊａｖａプログラム１は、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８を用いて、ファイルシステムＩ／Ｆとデータの授受を行う。また、Ｌｏｇｇｅｒオブジェクト１０４は、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８にＬｏｇｇｅｒフック１０７を接続し、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８を介したデータフローを監視する。
【０１０１】
アクセス先ファイル名一時保存部１０９は、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８がアクセスする先のファイル名を一時的に保存する。
【０１０２】
第２の実施形態に係る計算機システムでは、下記３種類のデータフローを想定し、監視する。
（１）Ｊａｖａプログラム１内部のデータフロー
（２）Ｊａｖａプログラム１がファイルからデータを読み込むデータフロー
（３）Ｊａｖａプログラム１からファイルへデータを書き込むデータフロー
（１）のＪａｖａプログラム１内部のデータフローは、第１の実施形態と同様であるため省略する。
【０１０３】
Ｊａｖａプログラム１とファイルサービス４との間のデータフローを記録するために、Ｊａｖａプログラム１は、Ｌｏｇｇｅｒオブジェクト１０４を通じてＬｏｇｇｅｒフック１０７が接続されたＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８を生成する。ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８の生成は、例えば、Ｌｏｇｇｅｒオブジェクト１０４に対してｏｐｅｎＦｉｌｅメソッドなどを呼び出すことで実現される。下記は、ｏｐｅｎＦｉｌｅメソッドの呼び出しのコードの一例である。
RandomAccessFile file = logger.openFile(“/home/user/sample.dat”, “rw”);
【０１０４】
ｏｐｅｎＦｉｌｅメソッドは、与えられた引数を用いてＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８を生成する。上記コードでは、“ｓａｍｐｌｅ．ｄａｔ”と“ｒｗ”が引数である。そして、ｏｐｅｎＦｉｌｅメソッドは、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８にＬｏｇｇｅｒフック１０７を接続させる。また、その際、Ｌｏｇｇｅｒオブジェクト１０４は、アクセス先ファイル名一時保存部１０９にアクセス先のファイル名などの情報を保存する。
【０１０５】
図１０は、アクセス先ファイル名一時保存部１０９に保存された情報の一例を示す図である。Ｌｏｇｇｅｒオブジェクト１０４は、ｌｏｇｇｅｒ．ｏｐｅｎＦｉｌｅメソッドの第１引数と、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８のオブジェクト識別子を、アクセス先ファイル名一時保存部１０９に格納する。上記のコードでは、“／ｈｏｍｅ／ｕｓｅｒ／ｓａｍｐｌｅ．ｄａｔ”がアクセス先ファイル４０１名として保存される。これにより、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８と、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８がアクセスしているファイルの名前とが関連付けられる。なお、アクセス先ファイル名一時保存部１０９に保存された情報は、当該ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８が用いられなくなった時点で削除してもよい。
【０１０６】
ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８を用いたデータ読み込みでは、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８に対してｒｅａｄやｒｅａｄＬｉｎｅといったメソッドを呼び出すことによってＪａｖａオブジェクト１０２へデータが読み込まれる。
【０１０７】
（２）Ｊａｖａプログラム１がファイルからデータを読み込むデータフロー
図１１は、ファイルからデータを読み込む場合のデータフローログの生成処理のフローチャートである。このフローは、Ｌｏｇｇｅｒフック１０７によりＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８に対するデータ読み込みメソッドが呼び出された時点にて開始される。
【０１０８】
Ｌｏｇｇｅｒフック１０７は、データが読み込まれたファイルの場所を得るために、データを読み込む前に、ファイルポインタをファイルポインタ管理部４０３から取得する（Ｓ６０１）。その後、実際にファイルからデータが読み込まれる（Ｓ６０２）と、Ｌｏｇｇｅｒフック１０７は再びファイルポインタをファイルポインタ管理部４０３から取得する（Ｓ６０３）。これにより、データの読み込み前後におけるファイルポインタを取得する。
【０１０９】
なお、Ｌｏｇｇｅｒフック１０７は、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８のｇｅｔＦｉｌｅＰｏｉｎｔｅｒメソッドを呼び出すことにより、ファイルポインタ管理部４０３からファイルポインタを取得することができる。
【０１１０】
Ｌｏｇｇｅｒフック１０７は、取得したＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８、データ読み込み先のＪａｖａオブジェクト１０２、読み込み前のファイルポインタ、読み込み後のファイルポインタをＬｏｇｇｅｒオブジェクト１０４へ転送する（Ｓ６０４）。Ｌｏｇｇｅｒフック１０７から情報を受け取ったＬｏｇｇｅｒオブジェクト１０４は、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８を用いて、アクセス先ファイル名一時保存部１０９を検索し、ファイル名を取得する（Ｓ６０５）。そして、Ｌｏｇｇｅｒオブジェクト１０４は、データ読み込み先のＪａｖａオブジェクト１０２のオブジェクト識別子をＳｙｓｔｅｍクラス１０３から取得する（Ｓ６０６）。
【０１１１】
Ｌｏｇｇｅｒオブジェクト１０４は、取得したアクセス先ファイル４０１名、読み込み前のファイルポインタ、読み込み後のファイルポインタ、読み込み先Ｊａｖａオブジェクト１０２のオブジェクト識別子から、データフローログを生成する（Ｓ６０７）。Ｌｏｇｇｅｒオブジェクト１０４は、生成されたデータフローログをログ受信部３に送信する（Ｓ６０８）。以上がファイルからデータを読み込む場合のデータフローログの生成処理である。
【０１１２】
下記は、ファイルからデータを読み込む場合のデータフローログの一例である。
{
“src”: {
“type”:“file”,
“path”:“/home/user/sample.dat”,
“from”:“10”,
“to”:“32”
},
“dst”: {
“type”:“java_internal”,
“object_hash”:“337422011”
},
“time”:“1439172160332”
}  
ｓｒｃフィールドが、アクセス先ファイル４０１内のデータを表し、ｄｓｔフィールドが読み込み先のＪａｖａオブジェクト１０２を表す。ｓｒｃフィールドのｔｙｐｅフィールドの値“ｆｉｌｅ”は、ｓｒｃフィールドがファイル内のデータを表していることを示す。ｓｒｃフィールドのｐａｔｈフィールドはアクセス先ファイル４０１名である。ｓｒｃフィールドのｆｒｏｍフィールドは、読み込み前のファイルポインタを示す。ｓｒｃフィールドのｔｏフィールドは、読み込み後のファイルポインタを示す。
【０１１３】
このように、Ｌｏｇｇｅｒフック１０７が、ファイルポインタ管理部４０３から、データフローの始点を示すファイルポインタを取得する。また、Ｌｏｇｇｅｒオブジェクト１０４が、Ｓｙｓｔｅｍクラス１０３からデータフローの終点を示すオブジェクト識別子を取得する。そして、Ｌｏｇｇｅｒオブジェクト１０４は、データフローの始点を示す情報および終点を示す情報が記録されたデータフローログを生成する。これにより、生成されたデータフローログに基づき、Ｊａｖａプログラム１がファイルサービス４からファイルのデータを読み込むデータフローを監視することができる。
【０１１４】
（３）Ｊａｖａプログラム１からファイルへデータを書き込むデータフロー
図１２は、ファイルへデータを書き込む場合のデータフローログの生成処理のフローチャートである。
【０１１５】
Ｌｏｇｇｅｒフック１０７は、データが書き込まれたファイルの場所を得るために、データを書き込む前に、ファイルポインタをファイルポインタ管理部４０３から取得する（Ｓ７０１）。その後、実際にファイルへデータが書き込まれると（Ｓ７０２）、Ｌｏｇｇｅｒフック１０７は再びファイルポインタをファイルポインタ管理部４０３から取得する（Ｓ７０３）。これにより、データの書き込み前後におけるファイルポインタを取得する。
【０１１６】
なお、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクトを用いたデータ書き込みでは、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクトに対してｗｒｉｔｅやｗｒｉｔｅＵＴＦなどのメソッドを呼び出すことにより、データがファイルへ書き込まれる。
【０１１７】
Ｌｏｇｇｅｒフック１０７は、取得したＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８、データ書き込み元のＪａｖａオブジェクト１０２、書き込み前のファイルポインタ、書き込み後のファイルポインタをＬｏｇｇｅｒオブジェクト１０４へ転送する（Ｓ７０４）。Ｌｏｇｇｅｒフック１０７から情報を受け取ったＬｏｇｇｅｒオブジェクト１０４は、ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト１０８を用いて、アクセス先ファイル名一時保存部１０９を検索し、アクセス先ファイル４０１名を取得する（Ｓ７０５）。そして、Ｌｏｇｇｅｒオブジェクト１０４は、データ書き込み元のＪａｖａオブジェクト１０２のオブジェクト識別子をＳｙｓｔｅｍクラス１０３から取得する（Ｓ７０６）。
【０１１８】
Ｌｏｇｇｅｒオブジェクト１０４は、取得したアクセス先ファイル４０１名、書き込み前のファイルポインタ、書き込み後のファイルポインタ、書き込み元Ｊａｖａオブジェクト１０２のオブジェクト識別子から、データフローログを生成する（Ｓ７０７）。Ｌｏｇｇｅｒオブジェクト１０４は、生成されたデータフローログをログ受信部３に送信する（Ｓ７０８）。以上がファイルへデータを書き込む場合のデータフローログの生成処理である。
【０１１９】
下記は、ファイルへデータを書き込む場合のデータフローログの一例である。
{
“src”: {
“type”:“java_internal”,
“object_hash”:“337422011”
},
“dst”: {
“type”:“file”,
“path”:“/home/user/sample.dat”,
“from”:“3”,
“to”:“35”
},
“time”:“1439172160332”
}  
ｓｒｃフィールドが書き込み元のＪａｖａオブジェクト１０２を表し、ｄｓｔフィールドがアクセス先ファイル４０１内のデータを表す。その他は、ファイルからデータを読み込む場合のデータフローログと同様である。
【０１２０】
上記のデータフローログに示すように、ｄｓｔフィールドのｆｒｏｍフィールドとｔｏフィールドは、バイト数で示されている。これにより、複数のＪａｖａオブジェクトが１つのファイルに書き込んだ場合においても、ファイル内のデータの場所を弁別することができる。
【０１２１】
このように、Ｌｏｇｇｅｒフック１０７が、ファイルポインタ管理部４０３から、データフローの終点を示すファイルポインタを取得する。また、Ｌｏｇｇｅｒオブジェクト１０４が、Ｓｙｓｔｅｍクラス１０３からデータフローの始点を示すオブジェクト識別子を取得する。そして、Ｌｏｇｇｅｒオブジェクト１０４は、データフローの始点を示す情報および終点を示す情報が記録されたデータフローログを生成する。これにより、生成されたデータフローログに基づき、Ｊａｖａプログラム１がファイルサービス４へファイルのデータを書き込むデータフローを監視することができる。
【０１２２】
以上のように、本実施形態によれば、Ｊａｖａプログラム１とファイルサービス４との間のデータフローを記録することができる。また、ファイル内のデータの場所が、バイト数により示されるファイルポインタにて記録されるため、ファイル内のデータの場所を弁別することができる。
【０１２３】
（第３の実施形態）
第１の実施形態では、Ｊａｖａプログラム１内部におけるデータフローを記録する方法について示した。本実施形態では、Ｊａｖａプログラム１内部ではなく、２つのＪａｖａプログラム同士が直接データを授受する場合において、データフローログを記録する方法について説明する。そして、第２コンポーネントがプロセスであっても、データフローが追跡可能であることを示す。なお、第１の実施形態と重複する説明は省略する。
【０１２４】
図１３は、第３の実施形態に係る計算機システム全体の概略構成の一例を示すブロック図である。ここでは、２つのＪａｖａプログラムを、第１Ｊａｖａプログラム１Ａと第２Ｊａｖａプログラム１Ｂと称して区別する。なお、第１Ｊａｖａプログラム１Ａと第２Ｊａｖａプログラム１Ｂとは別のＪａｖａプログラムがあってもよい。第１Ｊａｖａプログラム１Ａと第２Ｊａｖａプログラム１Ｂとは、同じ構成を有する。第１Ｊａｖａプログラム１Ａおよび第２Ｊａｖａプログラム１Ｂは、第１の実施形態のＪａｖａプログラム１と比べ、バインド一時保存部１０５、ＪＤＢＣドライバ１０６、Ｌｏｇｇｅｒフック１０７ではなく、オブジェクト送信部１１０と、オブジェクト受信部１１１と、プロセスＩＤ管理部１１２とを有することが異なる。
【０１２５】
オブジェクト送信部１１０は、Ｊａｖａプログラム１内のＪａｖａオブジェクトを、別のＪａｖａプログラム１へ送信する。オブジェクト受信部１１１は、別のＪａｖａプログラム１から送信されたＪａｖａオブジェクトデータを受信する。なお、図１３では、第１Ｊａｖａプログラム１Ａが送信を行い（送信側）、第２Ｊａｖａプログラム１Ｂが受信を行う（受信側）場合を示しているが、逆であってもよい。
【０１２６】
プロセスＩＤ管理部１１２は、Ｊａｖａプログラム１に付与されるプロセスＩＤを保持する。プロセスＩＤ管理部１１２は、Ｊａｖａの標準ライブラリに含まれるｊａｖａ．ｌａｎｇ．ｍａｎａｇｅｍｅｎｔ．ＲｕｎｔｉｍｅＭＸＢｅａｎオブジェクトなどを用いることができる。
【０１２７】
第３の実施形態では、Ｌｏｇｇｅｒオブジェクト１０４がプロセスＩＤ管理部１１２からＪａｖａオブジェクト１０１および１０２のプロセスＩＤを取得する。第３の実施形態では、複数のＪａｖａプログラム１が動作し、複数のＪａｖａプログラム１それぞれがＪａｖａプログラム１内部のデータフローログを生成する。ゆえに、データフローログの生成元のＪａｖａプログラム１を識別するために、データフローログに生成元のＪａｖａプログラム１の識別子を含める必要がある。そのため、第３の実施形態は、Ｊａｖａプログラム１のプロセスＩＤをデータフローログに含める。
【０１２８】
第３の実施形態に係る計算機システムでは、下記２種類のデータフローを想定し、監視する。
（１）Ｊａｖａプログラム１内部のデータフロー
（２）Ｊａｖａプログラム１同士間（第１Ｊａｖａプログラム１Ａと第２Ｊａｖａプログラム１Ｂ間）のデータフロー
【０１２９】
（１）Ｊａｖａプログラム１内部のデータフロー
図１４は、第３の実施形態に係るＪａｖａプログラム内部のデータフローログの生成処理のフローチャートである。本フローは、第１の実施形態同様、ｆｌｏｗメソッドの呼び出しにより、Ｌｏｇｇｅｒオブジェクト１０４にデータフローの始点および終点であるＪａｖａオブジェクト１０１と１０２が渡された時点で開始される。
【０１３０】
フロー開始時に、Ｌｏｇｇｅｒオブジェクト１０４はプロセスＩＤ管理部１１２からＪａｖａプログラム１のプロセスＩＤを取得する（Ｓ８０１）。後のＳ１０１からＳ１０４のフローは、第１の実施形態に係るＪａｖａプログラム１内部のデータフローログの生成処理と同様であるが、Ｓ１０３においてＬｏｇｇｅｒオブジェクト１０４はＳ８０１にて取得したプロセスＩＤをデータフローログに含ませる。ゆえに、生成されたデータフローログは第１および第２の実施形態と異なる。
【０１３１】
下記は、第３の実施形態のＪａｖａプログラム１内部のデータフローログの一例である。
{
“src”: {
“type”:“java_internal”,
“process_id”:“3233”,
“object_hash”:“1487365346”
},
“dst”: {
“type”:“java_internal”,
“process_id”:“3233”,
“object_hash”:“1786281489”
},
“time”:“1439172160987”
}
本実施形態では、ｓｒｃフィールドとｄｓｔフィールドのそれぞれに、ｐｒｏｃｅｓｓ＿ｉｄフィールドが含まれている。ｐｒｏｃｅｓｓ＿ｉｄフィールドは、Ｊａｖａプログラム１のプロセスＩＤを示す。Ｊａｖａプログラム１内部のデータフローログであるため、ｓｒｃフィールドとｄｓｔフィールドのｐｒｏｃｅｓｓ＿ｉｄフィールドの値（上記例では“３２３３”）は同じである。これにより、生成元のＪａｖａプログラム１を識別することができる。その他は第１の実施形態と同様である。
【０１３２】
このように、Ｌｏｇｇｅｒオブジェクト１０４は、データフローの始点を示す情報として、Ｓｙｓｔｅｍクラス１０３からＪａｖａオブジェクト１０１のオブジェクト識別子を、プロセスＩＤ管理部１１２からＪａｖａプログラム１のプロセスＩＤを取得する。また、Ｌｏｇｇｅｒオブジェクト１０４は、データフローの終点を示す情報として、Ｓｙｓｔｅｍクラス１０３からＪａｖａオブジェクト１０２のオブジェクト識別子を、プロセスＩＤ管理部１１２からＪａｖａプログラム１のプロセスＩＤを取得する。そして、Ｌｏｇｇｅｒオブジェクト１０４は、始点および終点を示す情報が記録されたデータフローログを生成する。これにより、生成されたデータフローログに基づき、各ＪａｖａプログラムのＪａｖａプログラムの内部のデータフローを監視することができる。
【０１３３】
（２）Ｊａｖａプログラム１同士間のデータフロー
次に、Ｊａｖａプログラム１同士間のデータフローの記録方法について述べる。図１５は、第３の実施形態に係るＪａｖａプログラム同士間のデータフローログの生成処理のフローチャートである。
【０１３４】
送信側（第１Ｊａｖａプログラム１Ａ）のＬｏｇｇｅｒオブジェクト１０４Ａが、オブジェクト識別子をＳｙｓｔｅｍクラス１０３Ａから取得する（Ｓ９０１）。また、送信側のＬｏｇｇｅｒオブジェクト１０４Ａは、プロセスＩＤをプロセスＩＤ管理部１１２Ａから取得する（Ｓ９０２）。そして、送信側のオブジェクト送信部１１０Ａは、取得されたオブジェクト識別子およびプロセスＩＤ、並びにシリアライズされたＪａｖａオブジェクト１０２Ａを受信側（第２Ｊａｖａプログラム１Ｂ）へ送信する（Ｓ９０３）。
【０１３５】
送信側のオブジェクト送信部１１０ＡがＪａｖａオブジェクト１０２Ａを送信する際、Ｊａｖａオブジェクトは通信路に送信可能な形式に変換されなくてはならない。この変換は、シリアライズと称される。受信側のオブジェクト受信部１１１Ｂは、送信されたデータを受け取り、シリアライズされたデータからＪａｖａオブジェクト１０１Ｂを生成する（Ｓ９０４）。このシリアライズされたデータからＪａｖａオブジェクトを生成することは、デシリアライズと称される。シリアライズおよびデシリアライズは、Ｊａｖａプログラム１のＳｅｒｉａｌｉｚａｂｌｅインタフェースを用いればよい。
【０１３６】
なお、送信側のオブジェクト送信部１１０Ａと、受信側のオブジェクト受信部１１１Ｂとの間の通信は、ＵＮＩＸ（登録商標）システムにおけるパイプ、ＵＮＩＸドメインソケット、ＴＣＰ／ＩＰ、または何らかのメッセージバスを用いた通信など、様々な手段を用いて実現することができる。
【０１３７】
受信側のＬｏｇｇｅｒオブジェクト１０４ＢがデシリアライズされたＪａｖａオブジェクト１０１Ｂのオブジェクト識別子をＳｙｓｔｅｍクラス１０３Ｂから取得する（Ｓ９０５）。また、受信側のＬｏｇｇｅｒオブジェクト１０４ＢがプロセスＩＤをプロセスＩＤ管理部１１２Ｂから取得する（Ｓ９０６）。そして、受信側のＬｏｇｇｅｒオブジェクト１０４Ｂは、送信側から受信したオブジェクト識別子およびプロセスＩＤ、並びに受信側にて取得したオブジェクト識別子とプロセスＩＤを用いて、データフローログを生成する（Ｓ９０７）。受信側のＬｏｇｇｅｒオブジェクト１０４Ｂは、生成したデータフローログをログ受信部３に送信する（Ｓ９０８）。以上が、第３の実施形態に係るＪａｖａプログラム１同士間のデータフローログの生成処理のフローである。
【０１３８】
下記は、第３の実施形態のＪａｖａプログラム１同士間のデータフローログの一例である。
{
“src”: {
“type”:“java_internal”,
“process_id”:“3233”,
“object_hash”:“1786281489”
},
“dst”: {
“type”:“java_internal”,
“process_id”:“1832”,
“object_hash”:“558392438”
},
“time”:“1439172173920”
}
上記データフローログにおいて、ｓｒｃフィールドのｐｒｏｃｅｓｓ＿ｉｄフィールドが送信側Ｊａｖａプログラム１ＡのプロセスＩＤを、ｄｓｔフィールドのｐｒｏｃｅｓｓ＿ｉｄフィールドが受信側Ｊａｖａプログラム１ＢのプロセスＩＤを表している。これにより、送信側のＪａｖａプログラム１Ａと受信側Ｊａｖａプログラム１Ｂを弁別することができる。
【０１３９】
このように、受信側のオブジェクト受信部１１１Ｂは、データフローの始点を示す情報として、Ｊａｖａオブジェクト１０２Ａのオブジェクト識別子およびＪａｖａプログラム１ＡのプロセスＩＤを取得する。また、受信側のＬｏｇｇｅｒオブジェクト１０４は、データフローの終点を示す情報として、Ｓｙｓｔｅｍクラス１０３ＢからデシリアライズされたＪａｖａオブジェクト１０１Ｂのオブジェクト識別子を、プロセスＩＤ管理部１１２ＢからＪａｖａプログラム１ＢのプロセスＩＤを取得する。そして、Ｌｏｇｇｅｒオブジェクト１０４Ｂは、始点および終点を示す情報が記録されたデータフローログを生成する。これにより、生成されたデータフローログに基づき、Ｊａｖａプログラム１同士間のデータフローを監視することができる。
【０１４０】
以上のように、本実施形態によれば、Ｊａｖａオブジェクトをシリアライズして送信する際に、送信側Ｊａｖａプログラム１におけるオブジェクト識別子と、送信側Ｊａｖａプログラム１のプロセスＩＤをともに送信する。これらの情報を用いて受信側Ｊａｖａプログラム１がデータフローログを生成することにより、Ｊａｖａプログラム１同士が直接データを授受する場合におけるデータフローを詳細に記録することができる。また、Ｊａｖａプログラム１内部のデータフローログの生成元のＪａｖａプログラム１を、複数のＪａｖａプログラム１が動作している場合においても、識別することができる。
【０１４１】
上記に説明した実施形態におけるデータフローログ生成装置は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用い、コンピュータ装置に搭載されたプロセッサに上記プログラムを実行させることにより実現することが可能である。
【０１４２】
図１６は、本発明の一実施形態におけるハードウェア構成の一例を示すブロック図である。データフローログ生成装置は、プロセッサ５０１、主記憶装置５０２、補助記憶装置５０３、ネットワークインタフェース５０４、デバイスインタフェース５０５、入力装置５０６、出力装置５０７を備え、これらがバス５０８を介して接続された、コンピュータ装置として実現できる。
【０１４３】
プロセッサ５０１が、補助記憶装置５０３からＪａｖａプログラム１を読み出して、主記憶装置５０２に展開して、実行することで、Ｊａｖａプログラム１内部の各機能を実現することができる。
【０１４４】
本実施形態のデータフローログ生成装置は、当該データフローログ生成装置で実行されるプログラムをコンピュータ装置に予めインストールすることで実現してもよいし、プログラムをＣＤ−ＲＯＭなどの記憶媒体に記憶して、あるいはネットワークを介して配布して、コンピュータ装置に適宜インストールすることで実現してもよい。
【０１４５】
ネットワークインタフェース５０４は、通信ネットワークに接続するためのインタフェースである。ＲＤＢ２、ログ受信部３、ファイルサービス４などと通信にて接続される場合は、このネットワークインタフェース５０４にて実現してもよい。ここではネットワークインタフェースを１つのみ示しているが、複数のネットワークインタフェースが搭載されていてもよい。
【０１４６】
デバイスインタフェース５０５は、外部記憶媒体６などの機器に接続するインタフェースである。外部記憶媒体６は、ＨＤＤ、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−ＲＡＭ、ＤＶＤ−Ｒ、ＳＡＮ（Ｓｔｏｒａｇｅ  ａｒｅａ  ｎｅｔｗｏｒｋ）等の任意の記録媒体でよい。また、ＲＤＢ２は、デバイスインタフェース５０５により接続されてもよい。
【０１４７】
主記憶装置５０２は、プロセッサ５０１が実行する命令、および各種データ等を一時的に記憶するメモリ装置であり、ＤＲＡＭ等の揮発性メモリでも、ＭＲＡＭ等の不揮発性メモリでもよい。バインド一時保存部１０５、アクセス先ファイル名一時保存部１０９、プロセスＩＤ管理部などは、主記憶装置５０２により実現することができる。補助記憶装置５０３は、プログラムやデータ等を永続的に記憶する記憶装置であり、例えば、ＨＤＤまたはＳＳＤ等がある。
【０１４８】
上記に、本発明の一実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１４９】
１  プロセス（Ｊａｖａプログラム）
１Ａ  第１Ｊａｖａプログラム
１Ｂ  第２Ｊａｖａプログラム
１０１、１０１Ａ、１０１Ｂ、１０２、１０２Ａ、１０２Ｂ  Ｊａｖａオブジェクト
１０３、１０３Ａ、１０３Ｂ  Ｓｙｓｔｅｍクラス
１０４、１０４Ａ、１０４Ｂ  Ｌｏｇｇｅｒオブジェクト
１０５  バインド一時保存部
１０６  ＪＤＢＣドライバ
１０７  Ｌｏｇｇｅｒフック
１０８  ＲａｎｄｏｍＡｃｃｅｓｓＦｉｌｅオブジェクト
１０９  アクセス先ファイル名一時保存部
１１０、１１０Ａ、１１０Ｂ  オブジェクト送信部
１１１、１１１Ａ、１１１Ｂ  オブジェクト受信部
１１２、１１２Ａ、１１２Ｂ  プロセスＩＤ管理部
２  リレーショナルデータベース（ＲＤＢ）
２０１  データベースインタフェース（ＤＢ＿Ｉ／Ｆ）
２０２  アクセス先テーブル
２０３  システムカタログ
２０４  一時ログテーブル
３  ログ受信部
４  ファイルサービス
４０１  アクセス先ファイル
４０２  ファイルサービスインタフェース（ファイルサービスＩ／Ｆ）
４０３  ファイルポインタ管理部
５０１  プロセッサ
５０２  主記憶装置
５０３  補助記憶装置
５０４  デバイスインタフェース
５０５  ネットワークインタフェース
５０６  バス
６  外部記憶媒体
【図１】
2017130111.tif 000003
【図２】
2017130111.tif 000004
【図３】
2017130111.tif 000005
【図４】
2017130111.tif 000006
【図５】
2017130111.tif 000007
【図６】
2017130111.tif 000008
【図７】
2017130111.tif 000009
【図８】
2017130111.tif 000010
【図９】
2017130111.tif 000011
【図１０】
2017130111.tif 000012
【図１１】
2017130111.tif 000013
【図１２】
2017130111.tif 000014
【図１３】
2017130111.tif 000015
【図１４】
2017130111.tif 000016
【図１５】
2017130111.tif 000017
【図１６】
2017130111.tif 000018