説明

トランザクションを集約して処理する方法、システム、およびプログラム

【課題】 トランザクションを集約して処理する方法、システム、およびプログラムを提供することである。
【解決手段】上記課題を解決するために第1の態様として、コンピュータの処理により、データベースにアクセスして、複数の照会クエリを含むトランザクションを集約する方法であって、前記コンピュータが前記データベースと接続され、複数クライアントから複数トランザクションを受信するステップと、前記複数トランザクション中の照会クエリを集約し、集約トランザクションとしてデータベースに送信するステップを有する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明はトランザクションの処理方法に関し、特に複数の照会クエリを含む集約トランザクションの処理方法、システムに関する。
【背景技術】
【0002】
通常、データベースにおけるトランザクション処理は、一貫した状態のデータベースを維持するよう設計されている。相互依存のある複数の操作が全て完了するか、全てキャンセルされることを保証している。そのために、ロック、ロールバック、デッドロックの回避の仕組みがある。
【0003】
ロックとは、特定のデータに対するアクセスや更新を制御することである。特にデータベースへの書き込み処理を行なう際に、データの整合性を保つためにアクセスやデータの読み書きを一時的に制限することである。より具体的には1つの処理がデータXにアクセス中は他の処理がXへアクセスできないように排他制御を行う。1つの処理が2つ以上のSQL文で表される場合にトランザクションを利用する。
【0004】
トランザクションは一連の処理(複数のSQLからなる照会クエリ)をまとめてコミット(確定)またはロールバック(取り消し)を行うことができる機能で、これを利用すれば1つのSQL文が失敗した場合、同じ処理の別のSQL文をすべて取り消すことができる。ロールバックはつまりトランザクションがコミット前に失敗した場合、データベースをトランザクション開始前の状態に戻す処理である。またデッドロックとは、2つのトランザクションの処理中にデータベース内の同じ部分に同時にアクセスすることで、互いの処理の進行を妨げる現象である。例えば、トランザクションAがデータXにアクセスし、トランザクションBがデータYにアクセスする場合、AがYにアクセスしようとし、BがXにアクセスしようとしたときデッドロックが発生する。この場合どちらのトランザクションも先に進めなくなる。このようなデッドロックを回避するには、両方のトランザクションをキャンセルし、ロールバックする。そして順序を変えて再実行し、デッドロックが再度発生しないようにする。
【0005】
クライアント数の増加と処理するデータ量の増大に伴い、データベースへのアクセスをより効率化する技術が知られている。特許文献1には、複数のロック制御によって複数のトランザクションの並行的な実行を制御する場合に、連続してなされるロック要求を蓄積し、ロック要求でない要求が出されたとき、この要求を処理する前に、前述の蓄積されたロック要求を一括してデ−タベ−スサ−バヘ送信し、ロック処理することによって送信回数を減少させる技術が開示されている。すなわち複数のトランザクション内でのロック要求をまとめる技術である。
【0006】
特許文献2には、入力された複数のトランザクションを別々に処理するのではなく、入力された複数のトランザクションが処理を行うデータ項目に対して、そのデータ項目を一度だけ検索し、検索したデータ項目に対して、複数のトランザクションの更新処理を順次メインメモリ内で行い、最後に更新した結果だけをデータベースに一度だけ書き込む手法を開示している。すなわち複数のトランザクションの更新をまとめる技術である。
【0007】
上記従来の方法は複数のトランザクションを1つにまとめて集約してデータベースに問い合わせる方法を採っていない。その理由は、複数のトランザクション(照会クエリ)に存在するSQL文を集約する方法が難しいことと、またSQLの集約が可能になったとしても、データベースに集約照会をした時に、照会したデータを更新するトランザクションが1つでも発生した場合、必然的にデッドロックが発生するからである。なお本発明ではトランザクションの分離レベルを「再読み込み可能読み取り」(REPEATABLEREAD)とする。この分離レベルではトランザクションにおいて対象となるすべてのテーブルの対象データがトランザクション実行中に変更されないことが保証される。
【先行技術文献】
【特許文献】
【0008】
【特許文献1】特開1993−0108452
【特許文献2】特開2009−0271665
【発明の概要】
【発明が解決しようとする課題】
【0009】
本発明が解決しようとする課題は、データベース・クライアントがトランザクション処理をデータベースに要求する際に、一部の照会クエリを、その他のトランザクションの照会クエリと共に、別トランザクション(集約トランザクション)としてデータベースに要求する、集約トランザクションの処理方法、システムを提供することである。
【0010】
さらに別の課題は、集約トランザクションの処理において、照会クエリを要求した全データベース・クライアントからのコミット要求を受信した時に前記集約トランザクションをコミットする方法、システムを提供することである。
【0011】
さらに別の課題は、集約トランザクションを処理するにあたり、デッドロックの生じないデータ更新方法、システムを提供することである。
【課題を解決するための手段】
【0012】
本発明は上記課題を解決するために、コンピュータの処理により、データベースにアクセスして、複数の照会クエリを含むトランザクションを集約する方法であって、前記コンピュータが前記データベースと接続され、複数クライアントから複数トランザクションを受信するステップと、前記複数トランザクション中の照会クエリを集約し、集約トランザクションとしてデータベースに送信するステップと、を有する。
【0013】
また、前記照会クエリは複数のSQL文からなり、前記データベースに送信するステップが、前記コンピュータが前記トランザクション中の照会クエリを、集合演算子を用いて集約し、集約トランザクションとしてデータベースに送信するステップと、である。
【0014】
また、前記送信するステップが、集約対象となる照会クエリのSQL文について前記照会クエリを発したクライアントのクライアントIDを対応付けるステップと、前記クライアントIDの型を含む、前記SQL文のデータ型を生成するステップと、複数クライアントからの全てのSQL文について異なるデータの型のみを追加して、集合したデータの型を生成するステップと、前記集合したデータの型の順番となるように各クライアントのSQL文を変換するステップと、前記変換後のSQL文のデータ型と変換前のSQL文のデータ型の対応関係を前記クライアントのクライアントID毎に記憶するステップと、全ての変換後のSQL文を集合演算子を用いて集約してデータベースに送信するステップである
【0015】
さらに、前記方法が、前記データベースから前記集約トランザクションに対する結果を受信するステップとを有する。
【0016】
さらに、前記方法が、前記結果を前記複数クライアントの各々トランザクションに対する照会結果に分割して送信するステップを有する。
【0017】
また、前記分割して送信するステップが、データベースから送信された結果からクライアントIDを判断するステップと、前記記憶した前記変換後のSQLのデータ型と変換前のデータ型の対応関係に基づき、前記クライアントID毎に、変換前のSQL文に対する照会結果に変換するステップと、前記クライアントIDを有するクライアントに照会結果を送信するステップである。
【0018】
そして、前記方法が、前記集約トランザクションで、クライアントが集約トランザクション経由で照会したデータを更新するステップであって、更新するデータが、集約トランザクションとして照会したかを前記コンピュータに問い合わせるステップと、集約トランザクションとして照会している場合、集約トランザクション経由で処理した照会クエリを、直接トランザクションとして、データベースに処理要求するステップと、前記クライアントからのコミット要求に応じて、更新するデータの更新クエリを直接トランザクションとして、データベースに処理要求するステップを有する。
【0019】
別の態様として、本発明は、データベースにアクセスして、複数の照会クエリを含むトランザクションを集約するシステムであって、複数クライアントから複数トランザクションを受信する手段と、前記複数トランザクション中の照会クエリを集約し、集約トランザクションとしてデータベースに送信する手段を有する。
【0020】
また、前記照会クエリは複数のSQL文からなり、前記データベースに送信する手段が、前記システムが前記トランザクション中の照会クエリを、集合演算子を用いて集約し、集約トランザクションとしてデータベースに送信する手段である。
【0021】
また、前記送信する手段が、集約対象となる照会クエリのSQL文について前記照会クエリを発したクライアントのクライアントIDを対応付ける手段と、前記クライアントIDの型を含む、前記SQL文のデータ型を生成する手段と、複数クライアントからの全てのSQL文について異なるデータの型のみを追加して、集合したデータの型を生成する手段と、前記集合したデータの型の順番となるように各クライアントのSQL文を変換する手段と、前記変換後のSQL文のデータ型と変換前のSQL文のデータ型の対応関係を前記クライアントのクライアントID毎に記憶する手段と、全ての変換後のSQL文を集合演算子を用いて集約してデータベースに送信する手段である。
【0022】
さらに、前記システムが、前記データベースから前記集約トランザクションに対する結果を受信する手段を有する。
【0023】
さらに、前記システムが、前記結果を前記複数クライアントの各々トランザクションに対する照会結果に分割して送信する手段を有する。
【0024】
また、前記分割して送信する手段が、データベースから送信された結果からクライアントIDを判断する手段と、前記記憶した前記変換後のSQLのデータ型と変換前のデータ型の対応関係に基づき、前記クライアントID毎に、変換前のSQL文に対する照会結果に変換する手段と、前記クライアントIDを有するクライアントに照会結果を送信する手段である。
【0025】
そして、前記システムが、前記集約トランザクションで、クライアントが集約トランザクション経由で照会したデータを更新する手段であって、更新するデータが、集約トランザクションとして照会したかを判断する手段と、集約トランザクションとして照会している場合、集約トランザクション経由で処理した照会クエリを、直接トランザクションとして、データベースに処理要求する手段と、前記クライアントからのコミット要求に応じて、更新するデータの更新クエリを直接トランザクションとして、データベースに処理要求する手段を有する。
【0026】
また別の態様として、上記何れか1つに記載の方法の各ステップを、コンピュータに実行させるためのプログラムを提供する。
【発明の効果】
【0027】
本発明により、複数のトランザクションを1つにまとめて集約してデータベースに問い合わせることが可能となる。またデータベースに集約トランザクションを問い合わせた場合に、データを更新するトランザクションが発生てもデッドロックすることなく、パフォーマンスに優れたデータベースアクセスが可能となる。
【図面の簡単な説明】
【0028】
【図1】本発明の全体のシステム構成を示す。
【図2】トランザクションをまとめてデータベース130へ送信する場合の図である。
【図3】集約トランザクションの問題点を示す図である。
【図4】本発明における集約トランザクションの処理例である。
【図5】クライアントとDB Proxy120の記憶構成ブロックを示す。
【図6】トランザクション開始時のクライアントの挙動を示す。
【図7】照会SQLを要求時のクライアントの挙動のフローチャートである。
【図8】更新SQLを要求時のクライアントの挙動のフローチャートである。
【図9】コミット要求時のクライアントの挙動のフローチャートである。
【図10】ロールバック要求時のクライアントの挙動のフローチャートである。
【図11】照会SQL要求受信時のDB Proxyの挙動のフローチャートである。
【図12】照会SQLのバッチ要求時の、DB Proxyの挙動のフローチャートである。
【図13】トランザクションのコミット要求時のDB Proxyの挙動のフローチャートである。
【図14】本発明における、クライアント、DB Proxy、データベースの例示的なハードウェア構成である。
【図15】SQL文例である。
【図16】別の SQL文例である。
【図17】SQLであるSELECT文の集約のフローチャートを示す。
【図18】データベース130から受信した結果を各クライアント用に分割するフローチャートを示す。
【図19】データベース130から受信した結果の例である。
【図20】データベース130から受信した結果を各クライアント用に分割する例1である。
【図21】データベース130から受信した結果を各クライアント用に分割する例2である。
【図22】データベース130から受信した結果を各クライアント用に分割する例3である。
【発明を実施するための形態】
【0029】
図1に本発明の全体のシステム構成を示す。DB Proxy120は複数のクライアント110からトランザクションを集約してデータベース130に送信する。DB Proxy120は複数のクライアントに対して1つ存在する。
【0030】
データベース130は、クライアント110、もしくは、DB Proxy120から受信する、複数のSQLを1つのトランザクションとして処理する。
【0031】
DB Proxy120は、トランザクションの開始をデータベース130に通知し、要求するSQLを送信し、その結果を受信し、コミット要求をデータベースに送信することで行う。なお一般的には、SQLの送信、結果の受信は、複数回行われる。
【0032】
なお本明細書の実施例において、クライアント110がトランザクションを開始する際の処理、照会SQLを要求する際の処理、更新SQLを要求する際の処理、コミット・ロールバックを要求する際の処理を詳細に説明する。また、DBProxy120が、上記のクライアント110の処理内で、クライアントから照会SQLを受信した際の処理、クライアントからコミット要求を受信した際の処理を詳細に説明する。
【0033】
なお説明の簡素化のため、DB Proxy120、クライアント110は、同時に1つのトランザクションしか要求しないものと仮定する。また、クライアント110とDBProxy120は、N対1の関係がついているものとする。
【0034】
図2に、トランザクションをまとめてデータベース130へ送信する場合を図示する。図2ではDBProxy120がクライアント1とクライアント2のトランザクション中の照会クエリをまとめてデータベースに要求することにより、データベースのスループットを向上させる。なお図中においてr は読み取り(Read)、wは書き込み(Write)を表し、その添え字の最初はクライアント番号、次の添え字は時系列順序を表している。
【0035】
図2において、クライアント1およびクライアント2は、トランザクション中の照会クエリを、DBProxy120に転送する。DB Proxy120は、複数のクライアントから受信した照会クエリを1つのクエリにまとめ、照会トランザクションとしてデータベース130に処理要求する。照会クエリは通常SQL文であるので、同時系列順序で出されたクライアント1のレコードAを参照するSQLと、クライアント2のレコードBを照会するSQL2つのSQLは、DBProxy120で1つのSQLに集約されてデータベース130に送信されることになる。
【実施例】
【0036】
図17に、SQLであるSELECT文の集約のフローチャートを示す。本発明ではSELECT文の集約に集合演算子であるUNIONALLを使用する。UNION 集合演算子とは複数の SELECT 文を1つに組み合わせる演算子である。しかし、複数の問い合わせを1つに結合することから、それぞれの問い合わせの抽出項目のリストは同数、かつ、同じグループのデータ型でなければ結合することができない。この方法により任意のSQLをまとめることが可能になる。
【0037】
まず1710で連結対象となるSELECT文と、クライアントID (INT型) を対応付ける。例として以下の2つのSELCECT文を結合対象として説明する。
S1: SELECT C11, C12, C13 FROM T1 WHEREK1=? →クライアントIDを1とする
> C11: INT, C12: DOUBLE, C13: STRING
S2: SELECT C21, C22, C23 FROM T0 WHERE K2=? →クライアントIDを2とする
> C21: DOUBLE, C22:INT, C23: DATE
【0038】
ステップ1720で、全てのSELECT文が返すデータ(カラム)の型を含む、データの型の集合を生成する。この時、同一グループのデータ型について型を増加させす1つにして異なるグループのデータ型は新しく付加する。すなわち型の集合を作成する時は異なる型のみを追加する。
例では、{INT, DOUBLE,STRING, DATE}となる。
【0039】
ステップ1730で、ステップ1720で生成した型の集合に順序をつけ、先頭にINT型を追加する。
例では、INT, INT, DOUBLE,STRING, DATEの順となる。
【0040】
ステップ1740で、各SELECT文に対し、ステップ1730でつけた順序で結果を返すように書き換える。もし、返す型が存在しない場合は、固定値を返すようにする。また、最初のINT型には、クライアントIDを固定値として返すようにする。
S1': SELECT 1, C11, C12, C13, NULL FROM T1 WHERE K1=?
S2': SELECT 2, C22, C21, ‘CONST', C23 FROM T2 WHERE K2=?
【0041】
ステップ1750で、元のSELECT文のデータ型(カラム)順序と、書き換えたSELECT文のデータ型(カラム)順序の対応を記憶する。記憶した内容は後ほど結果を分割するために使用する。
【0042】
S1とS1'の対応:{1→2, 2→3, 3→4} (1→2は、S1の1番目の項目がS1'の2番目の項目に対応することを意味する)
S2とS2'の対応:{1→3, 2→2, 3→5} (1→3は、S2の1番目の項目がS2'の3番目の項目に対応することを意味する)
【0043】
ステップ1760で、書き換えたSELECT文をUNION ALLで連結する。そしてデータベース130に照会する。
SELECT 1, C11, C12, C13, NULL FROM T1 WHERE K1=? UNION ALL SELECT 2,C22, C21, ‘CONST', C23 FROM T2 WHERE K2=?
【0044】
図18に、データベース130から受信した結果を各クライアント用に分割するフローチャートを示す。
【0045】
図19に、データベース130から受信した結果の例を示す。表は左から、INT, INT, DOUBLE, STRING, DATEの順で構成されたデータが5行存在している。左端のINT型データはクライアントIDを示している。
【0046】
図18のフローチャートに従い、ステップ1810で、データベース130から受信した結果から一行読み込む。すなわち1行目である、1, 1, 0.001, "AAAA"が読み込まれる。ステップ1820で、ステップ1810で読み込んだ行の、始めのINT型のデータからクライアントIDを取得する。この場合は1であるのでクライアント1であることがわかる。
【0047】
ステップ1830で、ステップ1820で読み込んだ行を、ステップ1750で記憶したデータ型順序の対応から、各クライアントが要求したデータ型の値のみを、要求順に並び替え、そのクライアントIDのSELECT文に対する結果とする。
【0048】
ここでクライアント1において、S1とS1'の対応関係は{1→2, 2→3, 3→4} であるので、1行目のデータは図20に示すように変換される。この処理を繰り返すことで、クライアント1のデータは図21に示すように、元の結果から分離され、変換されることになる。
【0049】
3行目からはクライアント2の結果であるので、S2とS2'の対応関係{1→3, 2→2, 3→5} を参照しながら、図22に示すように、元の結果から分離され、変換される。
【0050】
図18のフローチャートに従い、ステップ1840で、受信した結果が存在しない場合は処理を終了する。それ以外は、ステップ1810に戻る。
【0051】
本発明の集約と分割の特徴はまとめると次のようになる。
・SELECT対象となるデータの型情報のみを利用して、UNION ALLのデータ型を決定すること
・UNION ALLのデータ(カラム)名とクライアントの要求したSELECT文のデータ(カラム)名の対応関係から、各クライアント用の結果を分割して生成すること。
・SELECT文のIDが結果に含まれない場合は、空の結果(ResultSet)を生成すること
これにより本発明は、DB Proxy120で、複数の照会SQLを集約してデータベースに処理要求し、その結果をそれぞれのクライアントに分割して返すことができる。
【0052】
図2の集約クエリ送信後の問題点を図3で説明する。
1.クライアント1は、トランザクション中の照会クエリ(レコードAを照会r11)を、DB Proxy120に転送する。
2.クライアント2は、トランザクション中の照会クエリ(レコードBを照会r21)を、DB Proxy120に転送する。
3.DB Proxy120は、クライアント1とクライアント2から受信した照会クエリを1つのクエリにまとめ、集約トランザクション(レコードAとレコードBを同時照会r11+21)としてデータベース130に処理要求する。
4.ここでクライアント1が、同じトランザクション中の更新クエリを更新トランザクション(レコードAを更新w12)として、DB Proxy120経由で照会中の集約トランザクション(照会クエリ)とは別に、データベース130に要求する。
【0053】
しかし、この更新トランザクションは集約トランザクションによりレコードAがロックされているため、レコードAのロックが開放されるまで待たねばならないが開放されることがない。
【0054】
なぜなら、クライアント1の更新トランザクションは、DB Proxy120の照会トランザクションがコミットされないと、コミットできないからである。逆に、クライアント1の更新トランザクションよりコミットの通知を受けなくては、DBProxy120の照会トランザクションがコミットすることはないからである。すなわち、DB Proxy120に要求した照会クエリで照会したレコードAを、同じトランザクションで更新する場合、必ずデッドロックが発生することになる。
【0055】
そこで本発明では図4の方法を採る。以下の手順により、集約トランザクションで照会したレコードを更新する場合でも、デッドロックが発生しない。クライアント1が集約トランザクション経由で照会したデータを更新する際に、
4.まずクライアント1は、更新するレコードAが、集約トランザクションとして照会したかをDBProxy120に問い合わせる。集約トランザクションとして照会している場合、クライアント1は、集約トランザクション経由で処理した照会クエリを、直接トランザクションとして、データベース130に処理要求する。
5.クライアント1は、DBProxy120にコミット要求を出す。
6.クライアント1はレコードAの更新クエリを直接トランザクションとして、データベース130に処理要求する
【0056】
図5に、クライアントとDB Proxy120の記憶構成ブロックを示す。ここでDB Proxy120は説明のため1つのトランザクションのみを実行することを仮定する。
【0057】
クライアントは、照会済SQL記憶部、更新済SQL記憶部、モード、トランザクション状態を管理する。照会済SQL記憶部は、現在実行中のトランザクション内で照会したSQLの履歴を保持する。更新済SQL記憶部は、現在実行中のトランザクション内で更新したSQLの履歴を保持する。
【0058】
モードは、照会SQLの送信モードを意味し、Proxy時はDB Proxyを優先的に利用する、Direct時は直接利用することを意味する。なお、Null時はモードが決定されていないことを意味する。トランザクション状態は、クライアントが直接要求するトランザクションの状態を意味し、Active時はトランザクションを要求中、Inactiveはトランザクションを要求していないことを意味する。
【0059】
DB Proxyは、開始待ちクライアント記憶部、開始済クライアント記憶部、コミット済クライアント記憶部、バッチ待ち照会SQL記憶部を管理する。
【0060】
開始待ちクライアント記憶部は、DB Proxyが次のトランザクションでバッチ対象とするSQLを要求したクライアントの識別子のリストを保持する。開始済みクライアント記憶部は、DBProxyが現在バッチ対象とするSQLを要求したクライアントの識別子のリストを保持する。
【0061】
コミット済みクライアント記憶部は、開始済みクライアント記憶部のうち、コミット要求を受信したクライアントの識別子のリストを保持する。バッチ待ち照会SQL記憶部は、開始済みクライアント記憶部のクライアントがDBProxyに要求し、DB Proxyがまだデータベースに要求していないSQLを保持する。
【0062】
図6に、トランザクション開始時のクライアントの挙動を示す。
【0063】
ステップ602で、照会SQLを要求する。ステップ604でモードをNullに遷移する。次にステップ606で照会済SQL記憶部をクリアする。そしてステップ608で更新済SQL記憶部をクリアし、最後にステップ610でトランザクション状態をInactiveにする。
【0064】
図7に、照会SQLを要求時のクライアントの挙動のフローチャートを示す。
【0065】
クライアントが照会SQLを要求する際は、ステップ704で、モードがDirectモードか否かを判断する。Nullモード、もしくは、Proxyモードの場合は、Proxy経由でSQLが処理可能かを判断するためにステップ706へ移る。
【0066】
Proxy経由でSQLが処理可能かチェックするには、ステップ706でこれまでクライアントが同じトランザクション内で要求した更新データを、照会SQLが照会する可能性があるかを判断することで行う。
【0067】
例えば、図15のSQL A(UPDATE)をすでに実行済みで、SQL B(SELECT)という照会SQLを要求する場合は、更新したデータを照会することはないので、Proxy経由で照会可能となる。
【0068】
一方、SQL C(SELECT)という照会SQLを要求する場合は、更新データを照会する可能性があるため、Proxy経由で照会できない。また、SQLD(SELECT)のように、クエリからでは更新したデータを判定できない場合も、同様にProxy、経由で照会できないと判断する。
【0069】
ステップ708で、Proxy経由で照会する場合は、DB Proxyに照会SQLを送信し、ステップ710で、DB Proxyから照会SQL結果を受信するまで待機する。ステップ712で、照会SQL結果を受信後は、照会SQLを照会済SQL記憶部に追加し、ステップ714でモードをProxyモードに遷移させる。
【0070】
一方、Proxy経由で照会しない場合は、直接データベースに照会SQLを要求し、照会SQL結果を受信する。ステップ716で、もしトランザクションが開始されていない場合(トランザクション状態がInactiveの場合)は、ステップ718でトランザクション開始をデータベースに要求し、ステップ722でトランザクション状態をActiveにしてから、ステップ724で照会SQLを要求する。そしてステップ726でデータベース130から照会SQLの結果を受信する。
【0071】
図8に、更新SQLを要求時のクライアントの挙動のフローチャートを示す。
【0072】
ステップ802でクライアントが照会SQLを要求する際は、まず、ステップ804でモードがProxyモードか否かを判断する。
Proxyモードの場合は、ステップ706で照会SQLで照会したデータを、更新SQLが更新する可能性があるかを判断する。
【0073】
更新SQLが更新する可能性があるかのチェックは、照会済SQL記憶部内の照会SQLと、その照会結果をチェックすることで判定する。
例えば、照会済SQL記憶部内に、図16のSQL D(SELECT)という照会SQLを要求する場合、SQL E(UPDATE)という更新の際は更新する可能性がなく、SQLF(UPDATE)の際は更新する可能性があると判断する。
【0074】
ステップ806で、もし更新があると判断した場合は、これまでにProxy経由で照会したSQLを、再度直接データベースに要求し、照会結果を受信する。
【0075】
ステップ808で、クライアントがトランザクションを直接要求していない場合(トランザクション状態がInactiveの場合)は、ステップ810でデータベースにトランザクションの開始要求を行ってから、ステップ812で照会SQLを送信する。
【0076】
ステップ814で照会結果を受信後は、ステップ816でDirectモードに遷移し、ステップ818でDBProxyにコミット要求を送信する。そして処理はステップ820へ移る。
【0077】
Proxyモードではない場合、もしくは、照会結果を受信した後は、データベースに更新SQLを要求し、更新結果を受信する。
【0078】
ステップ820で、クライアントがトランザクションを直接要求していない場合(トランザクション状態がInactiveの場合)は、ステップ822でデータベースにトランザクションの開始要求を行い、ステップ824でトランザクション状態をActiveにしてから、ステップ826で更新SQLを送信する。ステップ828で更新結果を受信した後は、ステップ830で更新SQLを更新済みSQL記憶部に追加する。
【0079】
図9に、コミット要求時のクライアントの挙動のフローチャートを示す。
【0080】
ステップ902でコミット要求を出す際に、ステップ904でトランザクション状態がInactiveか判断する。Inactiveの場合はステップ906でデータベース130にコミット要求を出しステップ908へ移る。
【0081】
ステップ904でトランザクション状態がAciveの場合はステップ908でDBProxyモードか判断する。DB Proxyモードの場合はステップ910でDB Proxy120にコミット要求を出しステップ912に進む。ステップ908でDB Proxyモードでない場合にはステップ912でトランザクション処理終了となる。
【0082】
図10に、ロールバック要求時のクライアントの挙動のフローチャートを示す。
【0083】
ステップ1002で、ロールバックを要求する際、ステップ1004でトランザクション状態がInactiveかどうか判断する。Inactiveの場合はステップ1006でデータベースにロールバック要求し、ステップ1008に進む。Activeの場合は、ステップ1008でDBProxyモードかどうかを判断する。DB Proxyモードの場合は、ステップ1010でDBProxyにコミット要求し、ステップ1012に進む、DB Proxyモードでない場合にはステップ1012でトランザクション処理を終了する。
【0084】
図11に、照会SQL要求受信時のDB Proxyの挙動のフローチャートを示す。
【0085】
ステップ1102で、クライアントから照会SQLを受信する際、ステップ1104で、開始済クライアント記憶部にクライアントが含まれるか判断する。含まれる場合には処理はステップ1110に進む。含まれない場合にはステップ1106で、クライアントを開始待ちクライアント記憶部に追加する。そしてステップ1108で、クライアントが開始済みクライアント記憶部に追加されるまで待機する。そしてステップ1110で、バッチ待ち照会SQL記憶部に照会SQLを追加する。
【0086】
図12に、照会SQLのバッチ要求時の、DB Proxyの挙動のフローチャートを示す。
【0087】
ステップ1202で、バッチ待ち照会SQL記憶部内に照会SQLが存在するようになる待機する。ステップ1204で、バッチ待ち照会SQL記憶部内の照会SQLの1つを選択する。
【0088】
ステップ1206で、開始済クライアント記憶部内の他クライアントが、選択した照会SQLとバッチ可能なSQLを要求する可能性がないか判断する。可能性がある場合には処理はステップ1202に戻る。可能性がない場合にはステップ1208でバッチ待ち照会SQL記憶部から、照会SQLとバッチ可能な他クライアントの照会SQLを消去し、バッチ照会SQLとしてデータベースに要求する。次にステップ1210でデータベースから照会結果を受信し、バッチ照会SQLに含まれる照会SQLごとに、照会結果を分割し、要求したクライアントに送信する。
【0089】
図13に、トランザクションのコミット要求時のDB Proxyの挙動のフローチャートを示す。
【0090】
ステップ1302でクライアントからのコミット要求を待機する。ステップ1304で、コミット済クライアント記憶部にクライアントを追加する。
【0091】
ステップ1306でコミット済クライアント記憶部と開始済クライアント記憶部が同じかどうか判断する、同じでない場合、処理はステップ1316へ進む。同じ場合はステップ1308でデータベースにコミット要求し、ステップ1310で、開始済クライアント記憶部の全クライアントに、コミット完了を通知する。
【0092】
次にステップ1312で開始済みクライアント記憶部を消去する。そしてステップ1314で開始待ちクライアント記憶部にクライアントが存在するか判断する。存在しない場合には処理は1302に戻る。存在する場合にはステップ1316で、開始待ちクライアント記憶部の全クライアントを開始済クライアント記憶部に追加する。
【0093】
以下、図面を参照して、本発明の実施例のシステム構成例を説明する。ここで説明する構成要素は必須の構成要件ではなく、一実施例として説明するものであり、本発明の技術的範囲をこの一実施例に限定して解釈されるものではないことに留意されたい。
【0094】
図14を参照すると、本発明の一実施例に係る、クライアント、DBProxy、もしくはデータベースのシステム構成を実現するためのコンピュータ・ハードウェアのブロック図が示されている。
【0095】
図14において、システム・バス1409には、CPU1410と、主記憶(RAM)1420と、ハードディスク・ドライブ(HDD)1430と、ネットワークコントローラ1440と、キーボード1450と、マウス1460と、ディスプレイ1470と、オーディオコントローラ1480が接続されている。
【0096】
CPU1410は、好適には、32ビットまたは64ビットのアーキテクチャに基づくものであり、例えば、インテル社のPentium(商標)4、インテル社のCore(商標)2 DUO、AMD社のAthlon(商標)などを使用することができる。主記憶1420は、好適には、1GB以上の容量、より好ましくは、2GB以上の容量をもつものである。
【0097】
ハードディスク・ドライブ1430には、オペレーティング・システムが、格納されている。オペレーティング・システムは、Linux(商標)、マイクロソフト社のWindows7、Windows XP(商標)、Windows(商標)2000、アップルコンピュータのMacOS(商標)などの、CPU1410に適合するオペレーティング・システムとして任意のものでよい。
【0098】
ハードディスク・ドライブ1430には、好適にはORACLE(商標)、DB2(商標)、SQLSERVER(商標)、ACCESS(商標)などのリレーショナルデータベース・アプリケーションが格納される。これらのアプリケーション、ソフトウェアに限らずSQLを解釈できるものであれば任意に選択できる。そしてこれらのプログラムはオペレータのキーボードやマウス操作に応答して、メイン・メモリ1420にロードされて実行される。
【0099】
キーボード1450及びマウス1460は、オペレーティング・システムが提供するグラフィック・ユーザ・インターフェースに従い、データベースアプリケーションを開始したり、照会クエリの入力、パラメータの指定を提供するために使用される。
【0100】
ディスプレイ1470は、照会クエリの表示、照会結果の表示等、適宜表示するために使用される。また音声認識ソフトウェアを用いてオーディオコントローラ1480通じ、音声により照会クエリを入力するようにしてもよい。
【0101】
ネットワークコントローラ1440はネットワークを通じて、クライアント、DBProxy、データベース間で通信を行う。本発明はクライアント、DB Proxy、が夫々別のハードウェアに存在する必要はない。例えば、DBProxy とデータベースを1つのコンピュータ・ハードウェア内に構成しても良い。さらにクライアント、DBProxy、データベースを1つのデータベースサーバ内に置く態様も可能である。
【符号の説明】
【0102】
110 クライアント
120 DBProxy
130 データベース
1409 システム・バス
1410 CPU
1420 メイン・メモリ
1420 主記憶
1430 ハードディスク・ドライブ
1440 ネットワークコントローラ
1450 キーボード
1460 マウス
1470 ディスプレイ
1480 オーディオコントローラ

【特許請求の範囲】
【請求項1】
コンピュータの処理により、データベースにアクセスして、複数の照会クエリを含むトランザクションを集約する方法であって、前記コンピュータが前記データベースと接続され、
複数クライアントから複数トランザクションを受信するステップと、
前記複数トランザクション中の照会クエリを集約し、集約トランザクションとしてデータベースに送信するステップ、
を有する、方法。
【請求項2】
前記照会クエリは複数のSQL文からなり、前記データベースに送信するステップが、
前記コンピュータが前記トランザクション中の照会クエリを、集合演算子を用いて集約し、集約トランザクションとしてデータベースに送信するステップ、
である、請求項1記載の方法。
【請求項3】
前記送信するステップが、
集約対象となる照会クエリのSQL文について前記照会クエリを発したクライアントのクライアントIDを対応付けるステップと、
前記クライアントIDの型を含む、前記SQL文のデータ型を生成するステップと、
複数クライアントからの全てのSQL文について異なるデータの型のみを追加して、集合したデータの型を生成するステップと、
前記集合したデータの型の順番となるように各クライアントのSQL文を変換するステップと、
前記変換後のSQL文のデータ型と変換前のSQL文のデータ型の対応関係を前記クライアントのクライアントID毎に記憶するステップと、
全ての変換後のSQL文を集合演算子を用いて集約してデータベースに送信するステップ、
である、請求項2の方法。
【請求項4】
前記方法が、さらに
前記データベースから前記集約トランザクションに対する結果を受信するステップと、
を有する、請求項3記載の方法。
【請求項5】
前記方法が、さらに
前記結果を前記複数クライアントの各々トランザクションに対する照会結果に分割して送信するステップと、
を有する、請求項4記載の方法。
【請求項6】
前記分割して送信するステップが、
データベースから送信された結果からクライアントIDを判断するステップと、
前記記憶した前記変換後のSQLのデータ型と変換前のデータ型の対応関係に基づき、前記クライアントID毎に、変換前のSQL文に対する照会結果に変換するステップと、
前記クライアントIDを有するクライアントに照会結果を送信するステップ、
である、請求項5記載の方法。
【請求項7】
前記方法が、
前記集約トランザクションで、クライアントが集約トランザクション経由で照会したデータを更新するステップであって、
更新するデータが、集約トランザクションとして照会したかを前記コンピュータに問い合わせるステップと、
集約トランザクションとして照会している場合、集約トランザクション経由で処理した照会クエリを、直接トランザクションとして、データベースに処理要求するステップと、
前記クライアントからのコミット要求に応じて、更新するデータの更新クエリを直接トランザクションとして、データベースに処理要求するステップ、
を有する、請求項1記載の方法。
【請求項8】
データベースにアクセスして、複数の照会クエリを含むトランザクションを集約するシステムであって、
複数クライアントから複数トランザクションを受信する手段と、
前記複数トランザクション中の照会クエリを集約し、集約トランザクションとしてデータベースに送信する手段、
を有する、システム。
【請求項9】
前記照会クエリは複数のSQL文からなり、前記データベースに送信する手段が、
前記システムが前記トランザクション中の照会クエリを、集合演算子を用いて集約し、集約トランザクションとしてデータベースに送信する手段、
である、請求項8記載のシステム。
【請求項10】
前記送信する手段が、
集約対象となる照会クエリのSQL文について前記照会クエリを発したクライアントのクライアントIDを対応付ける手段と、
前記クライアントIDの型を含む、前記SQL文のデータ型を生成する手段と、
複数クライアントからの全てのSQL文について異なるデータの型のみを追加して、集合したデータの型を生成する手段と、
前記集合したデータの型の順番となるように各クライアントのSQL文を変換する手段と、
前記変換後のSQL文のデータ型と変換前のSQL文のデータ型の対応関係を前記クライアントのクライアントID毎に記憶する手段と、
全ての変換後のSQL文を集合演算子を用いて集約してデータベースに送信する手段、
である、請求項9のシステム。
【請求項11】
前記システムが、さらに
前記データベースから前記集約トランザクションに対する結果を受信する手段、
を有する、請求項10記載のシステム。
【請求項12】
前記システムが、さらに
前記結果を前記複数クライアントの各々トランザクションに対する照会結果に分割して送信する手段、
を有する、請求項11記載のシステム。
【請求項13】
前記分割して送信する手段が、
データベースから送信された結果からクライアントIDを判断する手段と、
前記記憶した前記変換後のSQLのデータ型と変換前のデータ型の対応関係に基づき、前記クライアントID毎に、変換前のSQL文に対する照会結果に変換する手段と、
前記クライアントIDを有するクライアントに照会結果を送信する手段、
である、請求項12記載のシステム。
【請求項14】
前記システムが、さらに、
前記集約トランザクションで、クライアントが集約トランザクション経由で照会したデータを更新する手段であって、
更新するデータが、集約トランザクションとして照会したかを判断する手段と、
集約トランザクションとして照会している場合、集約トランザクション経由で処理した照会クエリを、直接トランザクションとして、データベースに処理要求する手段と、
前記クライアントからのコミット要求に応じて、更新するデータの更新クエリを直接トランザクションとして、データベースに処理要求する手段、
を有する、請求項8記載のシステム。
【請求項15】
請求項1〜7記載の何れか1つに記載の方法の各ステップを、コンピュータに実行させるためのプログラム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate


【公開番号】特開2012−14502(P2012−14502A)
【公開日】平成24年1月19日(2012.1.19)
【国際特許分類】
【出願番号】特願2010−150989(P2010−150989)
【出願日】平成22年7月1日(2010.7.1)
【出願人】(390009531)インターナショナル・ビジネス・マシーンズ・コーポレーション (4,084)
【氏名又は名称原語表記】INTERNATIONAL BUSINESS MASCHINES CORPORATION
【Fターム(参考)】