ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(埋込みSQL編)

2.5 マルチスレッド環境におけるデータ操作

ここでは、マルチスレッド環境で動作するアプリケーションを開発する方法について説明します。

インターネット(アプリケーションサーバ)環境で動作するアプリケーションは、多くのクライアント端末からの依頼を受け、繰り返し起動や多重動作できることが必要とされます。このような条件では、高速な起動や資源の節約が期待できるマルチスレッド環境での動作が適しています。

マルチスレッド環境で動作するアプリケーションは共有のアドレス・スペースで複数のスレッドを使用します。スレッドは、プロセス内で実行されるサブプロセスです。1つのスレッドに対して1つの業務を割り当てることができ、複数のスレッドを使用して複数の業務を並列に実行できます。

最初にSymfoware/RDBをアクセスした時から終了まで、すなわち最初のCONNECT文から最後のDISCONNECT文までをセションと呼びます。1つのプロセスで1つのセションを実行する場合は、最初のSQL文の実行時にSymfoware/RDBが自動的にセション環境を作成しています。しかし、マルチスレッド環境では、複数のセションを同時に実行するため、セションを操作する関数を利用してセションの作成および破棄を行う必要があります。アプリケーション中で複数のセションを操作するために、セションの識別情報としてセションIDを使用します。セションIDは、プロセス内で一意な情報です。

Symfoware/RDBでは、スレッドとセションを対応付け、SQL文の実行環境を複数作成することによって、マルチスレッド環境下でアプリケーションを動作できます。

また、セションとスレッドの対応を一度切り離すことによって、無駄なスレッドを減らし、資源を有効に利用できます。

セションとスレッドの使用方法

マルチスレッド環境で動作するアプリケーションにおけるセションとスレッドの使用方法には、以下の3種類があります。省資源化およびレスポンスの向上を図るためには、スレッド数がセション数より少ない環境でアプリケーションを実行することを推奨します。なお、作成するスレッドの数に制限はありません。

セションを操作する関数については、“2.1 セション”を参照してください。

単一セションに対して複数のスレッドが対応する場合

1つのセションに対して複数のスレッドを同時に使用することはできません。セマフォを利用して排他制御を行ってください。

(1) セション1を作成します。セションIDはses1とします。

(2) セション1と動作スレッドを対応づけます。

(3) CONNECT文を実行します。

(4) セション1と動作スレッドの対応を切り離します。

(5) セション1とスレッドT1を対応付け、SQL文を実行した後、セション1とスレッドT1の対応を切り離します。1つのセションにおいて、同時に複数のスレッドを実行することはできません。セマフォを利用するなど、排他処理を行ってください。

(6) セション1とスレッドT2を対応付けます。スレッドT1で使用されていたセションID(ses1)が、スレッドT2に渡されます。同様にしてスレッドnまで動作します。

(7) セション1と動作スレッドを対応づけます。

(8) DISCONNECT文を実行します。

(9) セション1と動作スレッドの対応を切り離します。

(10) セション1を破棄します。

スレッド数がセション数以上の場合(スレッド数≧セション数)

この場合、各スレッドにセションが作成さているので、排他制御を考慮する必要はありません。ただし、複数スレッドが共通でCPUを使用するため、必ずしもレスポンスを向上できるとは限りません。

(1) セション1~セションnを作成します。

(2) 各セションに対してスレッドT1~Tnを対応付け、SQL文を実行した後、対応を切り離します。この場合、各スレッドに専用のセションがあるので、排他を考慮する必要はありません。

(3) セション1~セションnを破棄します。

スレッド数がセション数より少ない場合(スレッド数<セション数)

2つのスレッドを使用して3つのセションを実行する例を示します。セションとスレッドの対応を一度切り離すことにより、セション数よりも少ないスレッド数で動作できます。このため、資源の共用による省資源化を実現できます。また、ディスクのI/OなどによるCPUの無駄な待ち状態を解消する操作を行うことによって、レスポンスを向上できます。

(1) セション1~セション3を作成します。

(2) セション1とスレッドT1およびセション2とスレッドT2をそれぞれ対応付け、SQL文を実行した後、対応を切り離します。

(3) セション1とスレッドT1およびセション3とスレッドT2をそれぞれ対応付け、SQL文を実行した後、対応を切り離します。

(4) セション1における作業が終了したので、今までセション1で使用していたスレッドT1をセション2で使用します。また、セション3とスレッドT2を対応付けます。SQL文を実行した後、対応を切り離します。

(5) セション1~セション3を破棄します。