(57)【要約】【課題】参照のレイテンシの増加を軽減することができるプログラム、情報処理装置、ストレージシステム、ストレージシステムの制御方法を提供することである。【解決手段】実施形態のプログラムは、コンピュータに、第１記憶部または第２記憶部のうち参照用として設定された参照用記憶部から、アプリケーションの要求に応じた参照データを読み出させる。また、実施形態のプログラムは、複数の装置によって共用される外部ストレージ装置から更新データを受信したときに、前記第１記憶部または第２記憶部のうち前記参照用記憶部として設定されていない方の記憶部から順番に、前記更新データに基づく情報を書き込ませる。【選択図】図２
2018032072.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
第１記憶部または第２記憶部のうち参照用として設定された参照用記憶部から、アプリケーションの要求に応じた参照データを読み出させ、
複数の装置によって共用される外部ストレージ装置から更新データを受信したときに、前記第１記憶部または第２記憶部のうち前記参照用記憶部として設定されていない方の記憶部から順番に、前記更新データに基づく情報を書き込ませる、
プログラム。
【請求項２】
前記コンピュータに、
前記参照データが読み出されている記憶部への書き込みを行なわせようとする場合は、前記参照データの読み出しが終了するまで待機させ、前記参照データの読み出しが終了した後に前記更新データを書き込ませる
請求項１に記載のプログラム。
【請求項３】
前記コンピュータに、
前記更新データに基づく情報の書き込みが終了した後、前記第１記憶部または第２記憶部のうち前記更新データに基づく情報が書き込まれた方の記憶部を前記参照用記憶部に設定させる
請求項１または２に記載のプログラム。
【請求項４】
前記コンピュータに、
前記アプリケーションからの読み出し要求があった場合、前記参照用記憶部として設定された方の記憶部を示すネクストフラグを参照させ、前記ネクストフラグにより示された方の記憶部から前記参照データを読み出させるとともに、前記参照データの読み出し状態を示すリードフラグを、前記参照データを読み出させている方の記憶部を示す情報に書き換えさせる
請求項１に記載のプログラム。
【請求項５】
前記コンピュータに、
前記更新データを受信した場合、前記ネクストフラグに登録されていない方の記憶部に前記更新データに基づく情報を書き込ませるとともに、前記更新データに基づく情報の書き込みが終了した後、前記更新データに基づく情報の書き込みが終了した記憶部を示す情報に、前記ネクストフラグを書き換えさせる
請求項４に記載のプログラム。
【請求項６】
前記コンピュータに、
前記ネクストフラグに登録されていない方の記憶部が前記リードフラグに登録されているか否かを判定させ、
前記ネクストフラグに登録されていない方の記憶部が前記リードフラグに登録されている場合、前記リードフラグの示す読み出しが終了するまで待機させ、
前記ネクストフラグに登録されていない方の記憶部が前記リードフラグに登録されてない場合、前記更新データに基づく情報を前記ネクストフラグに登録されている方の記憶部に書き込ませる
請求項４または５に記載のプログラム。
【請求項７】
前記コンピュータに、さらに、
前記アプリケーションからの要求に応じて、前記参照データが前記第１記憶部または前記第２記憶部に記憶されているか否かを判定させ、前記参照データが前記第１記憶部または前記第２記憶部に記憶されていない場合、前記外部ストレージ装置から前記参照データを読み出させる
請求項１から６のうちいずれか一項に記載のプログラム。
【請求項８】
前記コンピュータに、
前記外部ストレージ装置に保存されているデータの全てをデータベース単位で、或いは前記外部ストレージ装置に保存されているデータの一部をテーブル単位、ブロック単位またはレコード単位で、前記第１記憶部および前記第２記憶部にキャッシュ構築させる
請求項１から７のうちいずれか一項に記載のプログラム。
【請求項９】
第１記憶部または第２記憶部のうち参照用として設定された参照用記憶部から、アプリケーションの要求に応じた参照データを読み出す参照部と、
複数の装置によって共用される外部ストレージ装置から更新データを受信したときに、前記第１記憶部または第２記憶部のうち前記参照用記憶部として設定されていない方の記憶部から順番に、前記更新データに基づく情報を書き込む管理部と、
を備える情報処理装置。
【請求項１０】
請求項９に記載の情報処理装置と、
前記外部ストレージ装置と、を備え、
前記外部ストレージ装置は、
前記複数の装置によって更新される共有データを記憶し、前記装置から前記共有データの更新要求があった場合、前記共有データを自身の管理する記憶装置において更新するとともに、前記共有データの送信先として管理情報に登録されている前記情報処理装置に対して前記更新データを送信する
ストレージシステム。
【請求項１１】
一以上の情報処理装置と外部ストレージ装置とを含むストレージシステムにおいて、
前記外部ストレージ装置が、
前記情報処理装置によって更新される共有データを記憶部に記憶させ、
前記情報処理装置から前記共有データの更新要求があった場合、
前記共有データを自身の管理する記憶装置において更新するとともに、
前記共有データの送信先として管理情報に登録されている前記情報処理装置に対して更新データを送信し、
前記情報処理装置が、
第１記憶部または第２記憶部のうち参照用として設定された参照用記憶部から、アプリケーションの要求に応じた参照データを読み出し、
前記外部ストレージ装置から更新データを受信したときに、前記第１記憶部または前記第２記憶部のうち前記参照用記憶部として設定されていない方の記憶部から順番に、前記更新データに基づく情報を書き込む、
ストレージシステムの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラム、情報処理装置、ストレージシステム、およびストレージシステムの制御方法に関する。
【背景技術】
【０００２】
従来、ＲＤＢＭＳ（Relational Data Base Management System）をアプリケーションと同じマシンに配置し、トランザクションの実行に必要なデータをバックエンド層のデータベースから動的に取得してトランザクションを実行する技術が知られている（例えば、特許文献１参照）。
【０００３】
また、サーバマシン上に保存されているデータの一部を加工したテーブルをクライアントマシンにキャッシュし、これを利用してクライアントアプリケーションを実行する技術が知られている（例えば、特許文献２参照）。
【０００４】
また、モバイル機器にＲＤＢＭＳを配置し、サーバマシンから取得したデータをモバイル機器にキャッシュする技術が知られている（例えば、特許文献３参照）。
【０００５】
特許文献１または２または３に記載の技術では、サーバマシンとクライアントマシンとの間の通信のレイテンシがボトルネックとなる問題は解消できる。しかしながら、特許文献２または３に記載の技術では、サーバマシンでの更新を自動的にクライントマシン上のデータベースに反映させる方法は述べられていない。また、特許文献１の技術で、サーバマシンでの更新を自動的にクライントマシン上のＲＤＢＭＳに反映させた場合、その反映のためにクライアントマシン上のＲＤＢＭＳで更新トランザクションが発生する。この更新トランザクションにより、クライアントマシン上のＲＤＢＭＳへの参照トランザクションが妨げられ、参照のレイテンシが増加する問題があった。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】米国特許出願公開第２００８／０２２２１１１号明細書
【特許文献２】特許第３５２７８３４号公報
【特許文献３】特許第４４４８４４４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
本発明が解決しようとする課題は、参照のレイテンシの増加を軽減することができるプログラム、情報処理装置、ストレージシステム、およびストレージシステムの制御方法を提供することである。
【課題を解決するための手段】
【０００８】
実施形態のプログラムは、コンピュータに、第１記憶部または第２記憶部のうち参照用として設定された参照用記憶部から、アプリケーションの要求に応じた参照データを読み出させる。また、実施形態のプログラムは、複数の装置によって共用される外部ストレージ装置から更新データを受信したときに、前記第１記憶部または第２記憶部のうち前記参照用記憶部として設定されていない方の記憶部から順番に、前記更新データに基づく情報を書き込ませる。
【図面の簡単な説明】
【０００９】
【図１】実施形態に係るストレージシステム１の全体構成を示す図である。
【図２】サーバマシン１０およびクライアントマシン２０の機能構成の一例を示すブロック図である。
【図３】キャッシュ構築処理の流れを説明するための図である。
【図４】クライアントアプリケーション２２０による参照処理の流れを説明するための図である。
【図５】同期的な一連更新処理の流れについて説明するための図である。
【図６】非同期的な一連更新処理の流れについて説明するための図である。
【図７】参照クエリ実行時のクライアントＤＢ参照部２３２による処理の流れの一例を示すフローチャートである。
【図８】キャッシュ管理部２３３による更新処理および書き換え処理の流れの一例を示すフローチャートである。
【図９】キャッシュ管理部２３３による処理の流れの一例を示すフローチャートである。
【図１０】クライアントＤＢ参照部２３２およびキャッシュ管理部２３３の処理タイミングの一例を示すシーケンス図である。
【図１１】図１０に示した処理におけるクライアントＤＢ管理情報の変化の一例を示す図である。
【発明を実施するための形態】
【００１０】
以下、実施形態のプログラム、情報処理装置、ストレージシステム、およびストレージシステムの制御方法について、図面を参照して説明する。
【００１１】
図１は、実施形態に係るストレージシステム１の全体構成を示す図である。図１に示す通り、実施形態のストレージシステム１は、例えば、サーバマシン１０と、複数のクライアントマシン２０−１、２０−２、および２０−３とを備える。これらの構成要素は、ネットワークＮＷを介して互いに通信可能に接続されている。以下の説明において、クライアントマシン２０−１、２０−２、および２０−３を区別しない場合、単にクライアントマシン２０と記す。なお、クライントマシン２０の数に特段の制限は存在せず、任意の数のクライントマシン２０がネットワークＮＷに接続されてよい。
【００１２】
サーバマシン１０は、複数のクライアントマシン２０によって共用される外部ストレージ装置である。
【００１３】
クライアントマシン２０には、組み込み型のＲＤＢＭＳが配置されている。組み込み型のＲＤＢＭＳとは、クライアントマシン内のアプリケーションプログラムに組み込んでライブラリとして利用できるＲＤＢＭＳである。クライアントマシン２０のライブラリには、サーバ１０側のデータベースに保存されている少なくとも一部のデータがキャッシュされている。これにより、クライアントマシン２０内のアプリケーションプログラムは、サーバ１０のデータベースでなく自身のライブラリを参照すればよいため、情報処理の高速化が実現できる。
【００１４】
次に、図２を参照して、サーバマシン１０およびクライアントマシン２０の機能構成について説明する。図２は、サーバマシン１０およびクライアントマシン２０の機能構成の一例を示すブロック図である。なお、クライアントマシン２０−１、２０−２、および２０−３のそれぞれは、ストレージシステム１を利用するための構成としては、同じ機能構成を有するものとする。
【００１５】
図２に示す通り、サーバマシン１０は、通信部１１０と、更新部１２０とを備える。通信部１１０は、ネットワークＮＷを介してクライアントマシン２０と通信する。更新部１２０は、例えば、クエリ実行部１２１と、サーバＤＢ１２２と、差分送信部１２３と、キャッシュ管理情報記憶部１２４とを備える。クエリ実行部１２１および差分送信部１２３は、例えば、ＣＰＵ（Central Processing Unit）などのプロセッサがプログラム（ソフトウェア）を実行することで実現される。また、これらのうち一方または双方は、ＬＳＩ（Large Scale Integration）やＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field-Programmable Gate Array）などのハードウェアによって実現されてもよいし、ソフトウェアとハードウェアの協働によって実現されてもよい。
【００１６】
クエリ実行部１２１は、通信部１１０を介してクライアントマシン２０から受信したクエリに基づいて、サーバＤＢ１２２に対する各種処理を実行する。例えば、クエリ実行部１２１は、クライアントマシン２０からサーバＤＢ１２２への更新クエリを受信した場合、更新クエリとともに受信した更新データに基づき、サーバＤＢ１２２に記憶されているテーブル（以下、サーバテーブルと記す）を更新する。また、クエリ実行部１２１は、サーバテーブルを更新した場合、更新クエリを送信したクライアントマシン２０に対して、完了通知を送信する。
【００１７】
サーバＤＢ１２２は、サーバテーブルを記憶する。サーバテーブルには、複数のクライアントマシン２０−１、２０−２、および２０−３上のクライアントアプリケーションにより共有されるデータ（以下、共有データと記す）が記憶されている。
【００１８】
差分送信部１２３は、サーバＤＢ１２２に記憶されている共有データに基づいて、クライアントマシン２０に対するキャッシュ構築処理および更新依頼処理を実行する。例えば、差分送信部１２３は、クライアントマシン２０のクライアントアプリケーションからテーブル名とともにキャッシュ構築クエリを受信した場合、指定されたテーブルのキャッシュをクライアントマシン２０に構築するための全ての情報をサーバＤＢ１２２から読み出し、キャッシュ構築クエリを送信したクライアントマシン２０に返す（キャッシュ構築処理）。また、差分送信部１２３は、サーバＤＢ１２２のサーバテーブルが更新された場合、更新データを、更新クエリを送信していないクライアントマシン２０に送信する（更新依頼処理）。
【００１９】
キャッシュ管理情報記憶部１２４は、各クライアントマシン２０にキャッシュされている共有データを管理する情報（以下、キャッシュ管理情報と記す）が記憶されている。キャッシュ管理情報には、例えば、クライアントマシン２０の識別情報と、当該クライアントマシン２０にキャッシュされている共有データを示す情報（テーブル名、ブロック名、レコード名など）とを対応づけた情報が含まれる。
【００２０】
クライアントマシン２０は、通信部２１０と、ＣＰＵなどのプロセッサ（コンピュータの一例）により実行されるクライアントアプリケーション２２０と、クライアントライブラリ２３０とを備える。通信部２１０は、ネットワークＮＷを介して、他のクライアントマシン２０及びサーバマシン１０と通信する。
【００２１】
クライアントアプリケーション２２０は、クエリをクライアントライブラリ２３０に出力し、クライアントＡＰＩを呼び出す。クライアントアプリケーション２２０は、例えば、参照クエリ、キャッシュ構築クエリ、更新クエリなどをクライアントライブラリ２３０に出力する。参照クエリとは、データの読み出し位置やデータの種類を指定して、読み出したいデータ（以下、参照データという）の読み出しを要求するコマンドである。参照クエリは、ＳＥＬＥＣＴ文等で表される。キャッシュ構築クエリとは、指定された共有データをサーバマシン１０から取得し、クライアントライブラリ２３０へのキャッシュ構築を要求するコマンドである。更新クエリとは、サーバマシン１０により記憶される共有データの変更を要求するコマンドである。更新クエリは、ＩＮＳＥＲＴ、ＵＰＤＡＴＥ、ＤＥＬＥＴＥ文等で表される。参照クエリおよび更新クエリは、一連のクエリを含むトランザクションとして出力される場合がある。
【００２２】
クライアントライブラリ２３０は、サーバマシン１０から受信した共有データを異なる２つのクライアントＤＢ（第１クライアントＤＢ２３４および第２クライアントＤＢ２３５）にそれぞれキャッシュしておき、参照クエリに従ってクライアントＤＢから参照データを読み出す参照処理と、両方のクライアントＤＢに対して、サーバマシン１０から指示された更新データを書き込む更新処理とを実行する。クライアントライブラリ２３０は、第１クライアントＤＢ２３４および第２クライアントＤＢ２３５のうち、参照処理を実行する対象のクライアントＤＢ（以下、参照用ＤＢと記す）と、更新処理を実行する対象のクライアントＤＢ（以下、更新用ＤＢと記す）とを切り替える。クライアントライブラリ２３０では、第１クライアントＤＢ２３４および第２クライアントＤＢ２３５のうち、いずれか一方のクライアントＤＢが参照用ＤＢに設定され、他方のクライアントＤＢが更新用ＤＢとして取り扱われる。クライアントライブラリ２３０は、参照用ＤＢとして設定されているクライアントＤＢでない方のクライアントＤＢに対して更新データを書き込んだ後に、更新データを書き込んだ方のクライアントＤＢを参照用ＤＢに設定する。これにより、いずれか一方のクライアントＤＢ（更新データが書き込み中でないことが保証される）が参照用ＤＢに設定されるため、クライアントアプリケーション２２０は、参照用ＤＢに設定されたクライアントＤＢを専有することができる。よって、参照処理が更新処理に妨げられず、レイテンシの増加を抑えることができる。
【００２３】
クライアントライブラリ２３０は、クライアントＡＰＩ（Application Programming Interface）２３１と、クライアントＤＢ参照部２３２と、キャッシュ管理部２３３と、前述した第１クライアントＤＢ２３４および第２クライアントＤＢ２３５と、クライアントＤＢ管理情報記憶部２３６と、クエリ送信部２３７とを備える。クライアントライブラリ２３０は、クライアントアプリケーション２２０毎に作成される。
【００２４】
クライアントＡＰＩ２３１は、クライアントアプリケーション２２０からのクエリに従って、クライアントライブラリ２３０内の構成に対して各種処理を指示する。なお、クライアントＡＰＩ２３１がＣＰＵにより実行されることで、クライアントＡＰＩ実行部が実現される。例えば、クライアントＡＰＩ２３１は、参照クエリＡＰＩと、キャッシュ構築ＡＰＩと、更新クエリＡＰＩとを含む。
【００２５】
参照クエリＡＰＩは、クライアントアプリケーション２２０からの参照クエリに従って、指定された参照データを読み出す参照処理をクライアントＤＢ参照部２３２に指示し、或いは、クエリ送信部２３７に指示して、参照データの読み出しを要求するコマンドをサーバマシン１０に対して送信させる。参照クエリＡＰＩは、例えば、第１クライアントＤＢ２３４および第２クライアントＤＢ２３５に記憶されたテーブルやブロック、レコードなどの一覧情報（不図示）を参照し、或いは第１クライアントＤＢ２３４または第２クライアントＤＢ２３５にアクセスすることで、参照データが第１クライアントＤＢ２３４または第２クライアントＤＢ２３５の少なくとも一方に記憶されているか否かを判定する。参照データが第１クライアントＤＢ２３４または第２クライアントＤＢ２３５の少なくとも一方に記憶されていない場合、参照クエリＡＰＩは、クエリ送信部２３７に指示して、参照データの読み出しを要求するコマンドをサーバマシン１０に対して送信させる。
【００２６】
参照データが第１クライアントＤＢ２３４または第２クライアントＤＢ２３５の少なくとも一方に記憶されている場合、参照クエリＡＰＩは、参照データを読み出す参照処理をクライアントＤＢ参照部２３２に指示する。
【００２７】
キャッシュ構築ＡＰＩは、クライアントアプリケーション２２０からのキャッシュ構築クエリに従って、指定されたテーブルのキャッシュをクライアントマシン２０に構築するための全ての情報をサーバマシン１０に対して要求し、サーバマシン１０から受信した情報に基づきキャッシュを構築するようキャッシュ管理部２３３に指示する。なお、キャッシュ構築ＡＰＩは、サーバマシン１０に保存されているデータの全てをデータベース単位で、或いはサーバマシン１０に保存されているデータの一部をテーブル単位、ブロック単位、レコード単位などの単位で、第１クライアントＤＢ２３４および第２クライアントＤＢ２３５にキャッシュ構築させる。
【００２８】
更新クエリＡＰＩは、クライアントアプリケーション２２０からの更新クエリに従って、クエリ送信部２３７に指示して、共有データの変更を指示するコマンドを、サーバマシン１０に対して送信させる。
【００２９】
クライアントＤＢ参照部２３２（参照部の一例）は、参照クエリＡＰＩからの指示に応じて、第１クライアントＤＢ２３４または第２クライアントＤＢ２３５から参照データを読み出す参照処理を実行する。また、クライアントＤＢ参照部２３２は、参照用ＤＢと更新用ＤＢとを切り替えるための情報をクライアントＤＢ管理情報記憶部２３６に書き込む切り替え処理を実行する。なお、クライアントＤＢ参照部２３２による切り替え処理については、図７を参照して後述する。
【００３０】
キャッシュ管理部２３３（管理部の一例）は、クライアントＡＰＩ２３１の指示に従って第１クライアントＤＢ２３４および第２クライアントＤＢ２３５にキャッシュを構築するための処理と、サーバマシン１０の指示に従って更新データを第１クライアントＤＢ２３４および第２クライアントＤＢ２３５に書き込む更新処理とを実行する。また、キャッシュ管理部２３３は、参照用ＤＢと更新用ＤＢとを切り替えるための情報をクライアントＤＢ管理情報記憶部２３６に書き込む切り替え処理を実行する。なお、キャッシュ管理部２３３による切り替え処理については、図８を参照して後述する。
【００３１】
第１クライアントＤＢ（第１記憶部の一例）２３４および第２クライアントＤＢ（第２記憶部の一例）２３５は、サーバマシン１０が記憶する共有データの一部または全部を記憶するキャッシュである。第１クライアントＤＢ２３４および第２クライアントＤＢ２３５は、例えば、ＲＡＭ、フラッシュメモリ、ＥＰＲＯＭ（Erasable Programmable Read Only Memory）、ハードディスク等により実現される。
【００３２】
クライアントＤＢ管理情報記憶部２３６は、クライアントＤＢ管理情報を記憶する。クライアントＤＢ管理情報は、第１クライアントＤＢ２３４と第２クライアントＤＢ２３５とを、参照用ＤＢあるいは更新用ＤＢに切り替える際に参照される情報である。クライアントＤＢ管理情報は、例えば、ネクストフラグ（ｎｅｘｔ−ｄｂ）と、リードフラグ（ｒｅａｄ−ｄｂ）とを含む。
【００３３】
ネクストフラグとは、例えば、参照用として設定された方の記憶部（参照用ＤＢ）を示す変数である。例えば、ネクストフラグには、クライアントアプリケーション２２０が次のトランザクションにおいて参照すべきクライアントＤＢの識別情報（第１クライアントＤＢ２３４の識別情報であれば「ＤＢ１」、第２クライアントＤＢ２３５であれば「ＤＢ２」など）が書き込まれる。また、ネクストフラグには、各クライアントＤＢに対するキャッシュ管理部２３３の更新処理の後、更新データが書き込まれたクライアントＤＢの識別情報が書き込まれる。
【００３４】
リードフラグとは、例えば、クライアントＤＢ参照部２３２によるデータの読み出し状態を示す変数である。例えば、リードフラグとしては、クライアントアプリケーション２２０が現在のトランザクションにおいて参照しているクライアントＤＢを表す変数（識別情報）、或いは、クライアントアプリケーション２２０がそのクライアントＤＢを参照していないことを表す変数（例えば、「非参照」を示す値など）が書き込まれる。
【００３５】
クエリ送信部２３７は、アプリケーションＡＰＩ２３１からの指示に従い、参照データの送信を要求するクエリを、通信部２１０を介してサーバマシン１０に送信する。
【００３６】
次に、図３を参照して、クライアントアプリケーション２２０によるキャッシュ構築処理の一例について説明する。図３は、キャッシュ構築処理の流れを説明するための図である。なお、ここで説明されない構成等についての図示は省略する。
【００３７】
クライアントアプリケーション２２０は、例えば、テーブルｔ１（ｃａｃｈｅ−ｔａｂｌｅ）を指定したキャッシュ構築クエリを出力する（１）。クライアントＡＰＩ２３１は、キャッシュ構築クエリに従い、キャッシュ管理部２３３に対して、テーブルｔ１のキャッシュ構築を指示する（２）。キャッシュ管理部２３３は、通信部２１０を介して、テーブル名（ｃａｃｈｅ−ｔａｂｌｅ）とともにキャッシュ構築クエリをサーバマシン１０の差分送信部１２３に送信する（３）。
【００３８】
サーバマシン１０の差分送信部１２３は、サーバＤＢ１２２からテーブルｔ１のスキーマと全レコードを読み出し（４）、テーブルｔ１がクライアントマシン２０にキャッシュされたことを示す情報をキャッシュ管理情報記憶部１２４に書き込む（５）。次いで、差分送信部１２３は、読み出したテーブルｔ１のスキーマと全レコードを、通信部１１０を介して、クライアントマシン２０のキャッシュ管理部２３３に送信する（６）。
【００３９】
キャッシュ管理部２３３は、サーバマシン１０から受信した情報に基づいて、テーブルｔ１を作成し、第１クライアントＤＢ２３４に書き込むとともに（７）、第２クライアントＤＢ２３５にも書き込む（８）。なお、（７）（８）の処理の順番はどちら先であってもよく、同時であってもよい。
【００４０】
書き込み処理が終了すると、キャッシュ管理部２３３は、クライアントＡＰＩ２３１に対して完了通知を出力する（９）。これを受けて、クライアントＡＰＩ２３１は、クライアントアプリケーション２２０に対して完了通知を出力する（１０）。
【００４１】
次に、図４を参照して、クライアントアプリケーション２２０による参照処理の一例について説明する。図４は、クライアントアプリケーション２２０による参照処理の流れを説明するための図である。なお、ここで説明されない構成等についての図示は省略する。
【００４２】
クライアントアプリケーション２２０は、クライアントＡＰＩ２３１に対して、トランザクションに係る参照クエリを出力する（２１）。クライアントＡＰＩ２３１は、参照クエリに従って、クライアントＤＢ参照部２３２に対し、指定された全ての参照テーブルから共有データを読み出すよう指示する（２２）。
【００４３】
クライアントＤＢ参照部２３２は、クライアントＤＢ管理情報記憶部２３６を参照して、第１クライアントＤＢ２３４および第２クライアントＤＢ２３５のうち、ネクストフラグに記述されているクライアントＤＢを選択し、選択したクライアントＤＢから参照データを読み出す（２３）。ここでのクライアントＤＢ参照部２３２による動作については、図７を参照して後述する。なお、図示の例では、ネクストフラグに第１クライアントＤＢ２３４の識別情報が記述されていたため、クライアントＤＢ参照部２３２が第１クライアントＤＢ２３４を選択している。
【００４４】
第１クライアントＤＢ２３４は、クライアントＤＢ参照部２３２による読み出しが終了するとその結果をクライアントＤＢ参照部２３２に出力する（２４）。クライアントＤＢ参照部２３２は、第１クライアントＤＢ２３４から入力された結果をクライアントＡＰＩ２３１に出力する（２５）。クライアントＡＰＩ２３１は、クライアントＤＢ参照部２３２から入力された結果をクライアントアプリケーション２２０に出力する（２６）。
【００４５】
次に、図５および図６を参照して、更新クエリに基づく処理と、それに続く更新処理（以下、これらをまとめて一連更新処理と記す）の一例について説明する。図５は、同期的な一連更新処理の流れについて説明するための図であり、図６は、非同期的な一連更新処理の流れについて説明するための図である。なお、ここで説明されない構成等についての図示は省略する。同期的な一連更新処理または非同期的な一連更新処理は、共有データを利用するユーザにより、いずれか一方が選択され、設定される。
【００４６】
はじめに、図５を参照して、同期的な一連更新処理について説明する。クライアントマシン２０−１は、クライアントライブラリ中の共有データが更新された場合、更新データとともに更新クエリをサーバマシン１０に送信する（３１）。サーバマシン１０のクエリ実行部１２１は、更新クエリを受信した場合、受信した更新データに基づき、サーバＤＢ１２２に記憶されているサーバテーブルを更新する（３２）。サーバＤＢ１２２は、クエリ実行部１２１による書き込みが終了するとその結果をクエリ実行部１２１に出力する（３３）。
【００４７】
クエリ実行部１２１は、サーバＤＢ１２２に書き込まれた更新データを差分送信部１２３に出力する（３４）。差分送信部１２３は、キャッシュ管理情報記憶部１２４を参照して、サーバＤＢ１２２において更新されたテーブル名を取得する（３５）。ここで、差分送信部１２３は、キャッシュ管理情報記憶部１２４を参照して、サーバＤＢ１２２において更新されたテーブルのキャッシュが構築されているクライアントマシン２０−２を、更新処理を指示する対象として決定する。差分送信部１２３は、クライアントマシン２０−２のクライアントライブラリ２３０に対して更新データを送信し、更新処理を実行するよう指示する（３６）。
【００４８】
クライアントマシン２０−２のキャッシュ管理部２３３は、通信部２１０を介して、サーバマシン１０から更新データを受信すると、受信した更新データを、ネクストフラグに記述されていない方のクライアントＤＢに書き込む（３７）。図示の例では、ネクストフラグに第１クライアントＤＢ２３４の識別情報が記述されていたため、キャッシュ管理部２３３は、第２クライアントＤＢ２３５に対して更新データを書き込む。第２クライアントＤＢ２３５に対する更新データの書き込みが終了した場合、キャッシュ管理部２３３は、ネクストフラグに第２クライアントＤＢ２３５の識別情報を書き込む（３８）。次いで、キャッシュ管理部２３３は、第１クライアントＤＢ２３４に対しても、受信した更新データを書き込む。
【００４９】
次いで、キャッシュ管理部２３３は、更新データがキャッシュに更新されたことを示すＯＫ通知を、通信部２１０を介してサーバマシン１０に送信する（３９）。なお、ＯＫ通知を送信する処理は、第２クライアントＤＢ２３５に対する更新データの書き込みが終了した時点で行われてもよい。サーバマシン１０の差分送信部１２３は、通信部１１０を介してクライアントマシン２０−１からＯＫ通知を受信すると、クエリ実行部１２１に対して、受信したＯＫ通知を出力する（４０）。クエリ実行部１２１は、入力されたＯＫ通知に基づいて、更新クエリを送信したクライアントマシン２０−１に対して、ＯＫ通知を送信する（４１）。
【００５０】
上述の通り、同期的な一連更新処理では、サーバマシン１０が、更新処理を行うクライアントマシン２０のクライアントＤＢに更新データが書き込まれた後、更新クエリを送信したクライアントマシン２０に対してＯＫ通知を返す。この構成により、サーバマシン１０が更新クエリの送信元であるクライアントマシン２０に対してＯＫ通知を送信した段階で、他のクライアントマシン２０のクライアントＤＢに更新データが書き込まれたことが保証される。また、サーバＤＢ１２２とクライアントＤＢとの記憶内容のずれを小さくすることができる。
【００５１】
次に、図６を参照して、非同期的な一連更新処理について説明する。クライアントマシン２０−１は、クライアントライブラリ中の共有データが更新された場合、更新された更新データとともに更新クエリをサーバマシン１０に送信する（５１）。サーバマシン１０のクエリ実行部１２１は、更新クエリを受信した場合、受信した更新データに基づき、サーバＤＢ１２２に記憶されているサーバテーブルを更新する（５２）。サーバＤＢ１２２は、クエリ実行部１２１による書き込みが終了すると、その結果をクエリ実行部１２１に出力する（５３）。クエリ実行部１２１は、更新データの書き込みが終了したことを示す完了通知を、クライアントマシン２０−１に出力する（５４）。
【００５２】
一方、差分送信部１２３は、サーバテーブルに対する更新があったか否かを監視する。サーバテーブルに対する更新があった場合、差分送信部１２３は、キャッシュ管理情報記憶部１２４を参照して、サーバＤＢ１２２において更新されたテーブル名を取得する（５５）。ここで、差分送信部１２３は、キャッシュ管理情報記憶部１２４を参照して、サーバＤＢ１２２において更新されたテーブルのキャッシュが構築されているクライアントマシン２０−２を更新処理の対象として決定する。差分送信部１２３は、サーバＤＢ１２２に書き込まれた更新データをサーバＤＢ１２２から読み出し（５６）、クライアントマシン２０−２のクライアントライブラリ２３０に対して更新データを送信し、更新処理を実行するよう指示する（５７）。
【００５３】
クライアントマシン２０−２のキャッシュ管理部２３３は、通信部２１０を介してサーバマシン１０から更新データを受信すると、受信した更新データを、ネクストフラグに記述されていない方のクライアントＤＢに書き込む（５８）。図示の例では、ネクストフラグに第１クライアントＤＢ２３４の識別情報が記述されていたため、キャッシュ管理部２３３は、第２クライアントＤＢ２３５に対して更新データを書き込む。第２クライアントＤＢ２３５に対する更新データの書き込みが終了した場合、キャッシュ管理部２３３は、ネクストフラグに第２クライアントＤＢ２３５の識別情報を書き込む（５９）。次いで、キャッシュ管理部２３３は、第１クライアントＤＢ２３４に対しても、受信した更新データの全てを書き込む。
【００５４】
上述の通り、非同期的な一連更新処理では、サーバＤＢ１２２への更新データの書き込みが完了した時点で、サーバマシン１０が、更新クエリを送信したクライアントマシン２０に対してＯＫ通知を返す。この構成により、更新クエリの送信元であるクライアントマシン２０から見た見かけ上の応答性を向上させることができる。
【００５５】
次に、図７を参照して、参照クエリ実行時のクライアントＤＢ参照部２３２による処理の流れについて説明する。図７は、参照クエリ実行時のクライアントＤＢ参照部２３２による処理の流れの一例を示すフローチャートである。
【００５６】
クライアントＡＰＩから参照処理が指示された場合、クライアントＤＢ参照部２３２は、これから参照データが読み出されるクライアントＤＢを表す情報を、リードフラグに書き込む。例えば、クライアントＤＢ参照部２３２は、クライアントＤＢ管理情報記憶部２３６を参照して、ネクストフラグに書き込まれている方のクライアントＤＢの識別情報をコピーして、リードフラグに代入する（ステップＳ１０１）。
【００５７】
そして、クライアントＤＢ参照部２３２は、ネクストフラグに書き込まれている方のクライアントＤＢから、参照データを読み出す（ステップＳ１０２）。その後、参照処理が終了した場合、クライアントＤＢ参照部２３２は、リードフラグを「非参照」に書き換える（ステップＳ１０３）。
【００５８】
次に、図８を参照して、キャッシュ管理部２３３による更新処理および書き換え処理の流れについて説明する。図８は、キャッシュ管理部２３３による更新処理および書き換え処理の流れの一例を示すフローチャートである。
【００５９】
キャッシュ管理部２３３は、サーバマシン１０から更新データを受信し（ステップＳ２０１）、クライアントＤＢ管理情報記憶部２３６を参照して、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢに対して、更新データを書き込む（ステップＳ２０２）。次いで、キャッシュ管理部２３３は、更新データの書き込みが終了したか否かを判定する（ステップＳ２０３）。更新データの書き込みが終了した場合、キャッシュ管理部２３３は、ネクストフラグの変数を、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢ（つまり、更新データを書き込んだクライアントＤＢ）の識別情報に書き換える（ステップＳ２０４）。
【００６０】
次いで、キャッシュ管理部２３３は、クライアントＤＢ管理情報記憶部２３６を参照して、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢが、リードフラグに書き込まれているか否かを判定する（ステップＳ２０５）。つまり、キャッシュ管理部２３３は、まだ更新データを書き込んでいない方のクライアントＤＢがクライアントＤＢ参照部２３２による参照処理中であるか否かを判定している。
【００６１】
ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢが、リードフラグに書き込まれている場合（つまり、まだ更新データを書き込んでいない方のクライアントＤＢがクライアントＤＢ参照部２３２による参照処理中である場合）、キャッシュ管理部２３３は、一定時間待機する（ステップＳ２０６）。
【００６２】
一方、ステップＳ２０５において、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢが、リードフラグに書き込まれていない場合（ステップＳ２０５で待機したことによって、クライアントＤＢ参照部２３２による参照処理が終了した場合を含む）、キャッシュ管理部２３３は、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢ（つまり、まだ更新データを書き込んでいない方のクライアントＤＢ）に、更新データを書き込む（ステップＳ２０７）。次いで、キャッシュ管理部２３３は、更新データの書き込みが終了したか否かを判定する（ステップＳ２０８）。更新データの書き込みが終了した場合、キャッシュ管理部２３３は、ネクストフラグの変数を、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢ（つまり、更新データを書き込んだクライアントＤＢ）の識別情報に書き換える（ステップＳ２０９）。
【００６３】
次に、図９を参照して、キャッシュ管理部２３３による処理の流れについて説明する。図９は、キャッシュ管理部２３３による処理の流れの一例を示すフローチャートである。ここでは、キャッシュ管理部２３３が非同期的な一連更新処理を実行する例について説明する。
【００６４】
キャッシュ管理部２３３は、クライアントＡＰＩ２３１によりキャッシュ構築が指示されたか否かを判定する（ステップＳ３０１）。クライアントＡＰＩ２３１によりキャッシュ構築が指示された場合、キャッシュ管理部２３３は、指定されたテーブル（例えば、テーブルｔ１）のキャッシュをクライアントマシン２０に構築するための全ての情報を、サーバマシン１０の差分送信部１２３に対して要求し、テーブルｔ１のスキーマと全レコードを取得する（ステップＳ３０２）。
【００６５】
キャッシュ管理部２３３は、サーバマシン１０の差分送信部１２３から取得した情報に基づいて、両方のクライアントＤＢ（第１クライアントＤＢ２３４および第２クライアントＤＢ２３５）にテーブルｔ１を作成し、全レコードを書き込む（ステップＳ３０３）。キャッシュ管理部２３３は、クライアントＡＰＩ２３１に対して完了通知を出力する（ステップＳ３０４）。
【００６６】
一方、ステップＳ３０１において、キャッシュ構築が指示されていない場合、キャッシュ管理部２３３は、サーバマシン１０から更新データを受信したか否かを判定する（ステップＳ３０５）。更新データを受信した場合、キャッシュ管理部２３３は、図８を参照して説明したキャッシュ管理部２３３による処理を実行する（ステップＳ３０６）。
【００６７】
次に、図１０および１１を参照してクライアントＤＢの切り替え処理について説明する。図１０は、クライアントＤＢ参照部２３２およびキャッシュ管理部２３３の処理タイミングの一例を示すシーケンス図である。図１１は、図１０に示した処理におけるクライアントＤＢ管理情報の変化の一例を示す図である。
【００６８】
図１０に示す通り、はじめにトランザクションに係る参照クエリが発生したとする。この場合、クライアントＤＢ参照部２３２は、クライアントＤＢ管理情報記憶部２３６を参照して、ネクストフラグに記述されているクライアントＤＢをリードフラグに書き込む。例えば、ネクストフラグに「ＤＢ１」と記述されている場合、クライアントＤＢ参照部２３２は、リードフラグに「ＤＢ１」と書き込む（７１）。続けて、クライアントＤＢ参照部２３２は、リードフラグに記述されているクライアントＤＢから参照情報を読み出す。リードフラグには「ＤＢ１」と記述されているため、クライアントＤＢ参照部２３２は、第１クライアントＤＢ２３４を参照して、参照クエリにおいて指定されている全ての参照テーブルにわたって、参照データの読み出しを開始する（７２）。
【００６９】
クライアントマシン２０においてトランザクションが実行中の状態で（７３）、更新クエリが発生したとする。このとき、キャッシュ管理部２３３は、クライアントＤＢ管理情報記憶部２３６を参照して、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢがリードフラグに登録されているか否かを判定する。上述の通り、ネクストフラグに「ＤＢ１」が、リードフラグに「ＤＢ１」が記述されている。このため、キャッシュ管理部２３３は、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢがリードフラグに登録されていないと判定し、ネクストフラグ「ＤＢ１」でない方の第２クライアントＤＢ２３５に、更新データを書き込む（７４）。この状態を、図１１（ａ）に示す。
【００７０】
更新データの書き込みが終了すると、キャッシュ管理部２３３は、ネクストフラグを「ＤＢ１」から「ＤＢ２」に書き換える（７５）。次いで、キャッシュ管理部２３３は、クライアントＤＢ管理情報記憶部２３６を参照して、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢがリードフラグに書き込まれているか否かを判定する。上述の通り、ネクストフラグに「ＤＢ１」が、リードフラグに「ＤＢ２」が記述されている。このため、キャッシュ管理部２３３は、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢがリードフラグに書き込まれていると判定し、一定時間待機する（７６）。この状態を、図１１（ｂ）に示す。
【００７１】
一方、クライアントＤＢ参照部２３２は、参照クエリにおいて指定されている全ての参照テーブルにわたって、全ての参照情報の読み出しが完了した場合、リードフラグを「非参照」に書き換える（７７）。これにより、ネクストフラグに書き込まれているクライアントＤＢでない方のクライアントＤＢがリードフラグに書き込まれていない状態となるため、クライアントＤＢ参照部２３２は、待機を終了し、ネクストフラグ「ＤＢ２」でない方の第１クライアントＤＢ２３４に、更新データを書き込む（７８）。この状態を、図１１（ｃ）に示す。
【００７２】
更に、キャッシュ管理部２３３による第１クライアントＤＢ２３４への書き込みが実行されている状態において、参照クエリが発生したとする。この場合、クライアントＤＢ参照部２３２は、クライアントＤＢ管理情報記憶部２３６を参照して、ネクストフラグに書き込まれているクライアントＤＢをリードフラグに書き込む（７９）。ここでは、ネクストフラグに「ＤＢ２」と記述されているため、クライアントＤＢ参照部２３２は、リードフラグの「非参照」を「ＤＢ２」に書き換える。続けて、クライアントＤＢ参照部２３２は、リードフラグに書き込まれているクライアントＤＢから参照データを読み出す（８０）。リードフラグには「ＤＢ２」と記述されているため、クライアントＤＢ参照部２３２は、第２クライアントＤＢ２３５を参照して、参照クエリにおいて指定されている全ての参照テーブルにわたって、参照データを読み出す。この状態を、図１１（ｄ）に示す。
【００７３】
上述したように、本実施形態のクライアントマシン２０によれば、アプリケーションに係る読み出し処理と更新データの書き込み処理とが同時に発生した場合であっても、各処理を別のクライアントＤＢを用いて並行して実行することができるため、レイテンシの増加を回避することができる。
【００７４】
例えば、本実施形態のクライアントマシン２０によれば、更新データが更新されたクライアントＤＢを次回の参照用ＤＢに設定するため、次回の参照時において、速やかに更新された共有データを参照することができる。また、このことは、アプリケーションによるデータの読み出し処理がトランザクションに係る処理である場合に特に有効である。一方のクライアントＤＢが読み出し処理中であっても、他方のクライアントＤＢに更新データを書き込めばよいからである。また、更新データの書き込みが頻繁に発生する場合であっても、他方のクライアントＤＢから参照データを読み出せばよいため、アプリケーションに係る読み出し処理が更新処理により妨げられる場面が少なくなる。
【００７５】
また、本実施形態のクライアントマシン２０によれば、クライアントＤＢを２つ備えることにより、クライアントＤＢが１つであるマシンに比べて、ロックによるレイテンシの増加を抑えることができる。クライアントＤＢが１つであるマシンでは、トランザクションが終了するまで各テーブルまたは各行に対してロックをとる必要があるが、クライアントマシン２０ではトランザクションの開始時と終了時（リードフラグの書き換え時）にロックをとればよいからである。
【００７６】
また、本実施形態のクライアントマシン２０によれば、クライアントＤＢ参照部２３２は、ネクストフラグが示す参照用ＤＢから参照データを読み出すとともに、参照用ＤＢから参照データが読み出されている状態であることをリードフラグに登録する。これにより、キャッシュ管理部２３３は、ネクストフラグを参照することにより更新用ＤＢがどちらであるかを判別することができるとともに、リードフラグを参照することによりクライアントＤＢが読み出し処理中であるか否かを判定することができる。
【００７７】
また、本実施形態のクライアントマシン２０によれば、キャッシュ管理部２３３は、ネクストフラグを参照することにより、参照用ＤＢでない方のクライアントＤＢに更新データを更新するとともに、更新データを更新したクライアントＤＢを参照用ＤＢに切り替える。よって、キャッシュ管理部２３３は、クライアントＤＢ参照部２３２により読み出し処理がなされる可能性のない方のクライアントＤＢに更新データを書き込むことができ、クライアントＤＢ参照部２３２は、キャッシュ管理部２３３により書き込み処理がなされる可能性のない方のクライアントＤＢから参照データを読み出すことができる。
【００７８】
また、本実施形態のクライアントマシン２０によれば、キャッシュ管理部２３３は、ネクストフラグとリードフラグを参照することにより、次に更新データを更新するクライアントＤＢが参照データの読み出し中であるか否かを判別し、参照データの読み出しが終了した後で更新データを更新することができる。
【００７９】
なお、本発明は上述した実施形態に限られない。例えば、クライアントＡＰＩ２３１は、参照テーブルがクライアントＤＢにキャッシュされている場合であっても、所定の場合には、クエリ送信部２３７に対して、サーバマシン１０から参照データを読み出させるよう指示してもよい。これにより、一貫性が重要なトランザクションの場合に有益である。
【００８０】
以上説明した少なくとも一つの実施形態によれば、コンピュータに、第１クライアントＤＢ２３４または第２クライアントＤＢ２３５のうち参照用として設定された参照用ＤＢから、クライアントアプリケーションの要求に応じた参照データを読み出させ、複数のクライアントマシン２０によって共用されるサーバマシン１０から更新データを受信したときに、第１クライアントＤＢ２３４または第２クライアントＤＢ２３５のうち参照用ＤＢとして設定されていない方から順番に、更新データに基づく情報を書き込ませることにより、レイテンシの増加を軽減することができる。
【００８１】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると同様に、特許請求の範囲に記載された発明とその均等の範囲に含まれるものである。
【符号の説明】
【００８２】
１…ストレージシステム、１０…サーバマシン、２０…クライアントマシン、１１０…通信部、１２０…更新部、１２１…クエリ実行部、１２２…サーバＤＢ、１２３…差分送信部、１２４…キャッシュ管理情報記憶部、２１０…通信部、２２０…クライアントアプリケーション、２３０…クライアントライブラリ、２３１…クライアントＡＰＩ、２３２…クライアントＤＢ参照部、２３３…キャッシュ管理部、２３４…第１クライアントＤＢ、２３５…第２クライアントＤＢ、２３６…クライアントＤＢ管理情報記憶部、２３７…クエリ送信部
【図１】
2018032072.tif 000003
【図２】
2018032072.tif 000004
【図３】
2018032072.tif 000005
【図４】
2018032072.tif 000006
【図５】
2018032072.tif 000007
【図６】
2018032072.tif 000008
【図７】
2018032072.tif 000009
【図８】
2018032072.tif 000010
【図９】
2018032072.tif 000011
【図１０】
2018032072.tif 000012
【図１１】
2018032072.tif 000013