スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド

[目次][索引][前へ][次へ]

14.7 ODBC関数の非同期実行

<この節の構成>
(1) ODBC関数の非同期実行とは
(2) ODBC関数の非同期実行の手順
(3) ODBC関数の非同期実行のキャンセル
(4) コーディング例

(1) ODBC関数の非同期実行とは

ODBC対応アプリケーションプログラムからHiRDBをアクセスする場合,ODBC関数を非同期に実行できます。

ODBC関数を同期実行する場合,関数呼出しが終了するまで,ODBCドライバはアプリケーションプログラムに制御を返せません。非同期実行の場合だと,任意にアプリケーションプログラムに制御を返せます。そのため,ODBC関数が非同期実行されている間に,アプリケーションプログラムはほかの処理を実行できます。

非同期実行できるODBC関数を次に示します。

(2) ODBC関数の非同期実行の手順

ODBC関数を非同期に実行する場合の手順を次に示します。

<手順>
  1. 特定のhstmt(ステートメントハンドル)だけで非同期実行を有効にするオプションSQL_ASYNC_ENABLEを使用して,SQLSetStmtOption※1を呼び出します。hdbc(接続ハンドル)について,関連するすべてのhstmtで非同期実行を有効にする場合は,オプションSQL_ASYNC_ENABLEを使用してSQLSetConnectOption※2を呼び出します。
  2. 非同期実行が有効となっているhstmtを使用して非同期実行できるODBC関数※1を呼び出すと,ODBCドライバはその関数の非同期実行を開始し,SQL_STILL_EXECUTINGを返します(非同期実行とならなかった場合,又はエラーが発生した場合は,SQL_SUCCESSやSQL_ERRORなどの同期実行時のコードを返します)。
  3. ODBC関数が非同期実行されている間に,アプリケーションプログラムはほかの処理を実行できます。非同期実行しているhstmtと,それに関連するhdbcでアプリケーションプログラムが呼び出せる関数は,SQLAllocStmt,SQLCancel,又はSQLGetFunctionsだけです。そのほかの関数(非同期実行中の関数を除く)を呼び出すと,ドライバマネージャからシーケンスエラーが返されます。
  4. アプリケーションプログラムは非同期実行のODBC関数を呼び出して,その関数の実行が終了したかどうかを確認します。関数が引き続き実行状態の場合はSQL_STILL_EXECUTINGが返され,処理が終了している場合はSQL_SUCCESSやSQL_ERRORなどのリターンコードが返されます。
    確認のために関数を呼び出す場合,hstmt以外の引数は指定しても無視されます(ただし,不当なアドレス,指定値はエラーとなる可能性があるため,有効な値でなければなりません)。例えば,INSERT文でSQLExecDirectを非同期実行し,再度SQLExecDirectを呼び出す場合に,UPDATE文を指定していても戻り値はINSERT文実行の状態が返ります。

特定のhstmtだけで非同期実行を無効にする場合も,オプションSQL_ASYNC_ENABLEを使用してSQLSetStmtOptionを呼び出します。hdbcについて,関連するすべてのhstmtで非同期実行を無効にする場合は,オプションSQL_ASYNC_ENABLEを使用してSQLSetConnectOptionを呼び出します。

注※1
SQLSetStmtOptionでの設定内容を次に示します。
fOption 設定内容
SQL_ASYNC_ENABLE SQL_ASYNC_ENABLE_OFF,又はSQL_ASYNC_ENABLE _ON
SQL_BIND_TYPE 設定できません。
SQL_MAX_LENGTH サーバの制限値,又はユーザの指定値
SQL_NOSCAN (Default=FALSE) SQL_NOSCAN_OFF,又はSQL_NOSCAN_ON
SQL_QUERY_TIMEOUT 設定できません。
SQL_MAX_ROWS サーバの制限値,又はユーザの指定値

注※2
SQLSetConnectOptionでの設定内容を次に示します。
fOption 設定内容
SQL_ACCESS_MODE SQL_MODE_READ_WRITE固定
SQL_AUTOCOMMIT SQL_AUTOCOMMIT_OFF,又は SQL_AUTOCOMMIT_ON
SQL_LOGON_TIMEOUT 設定できません。
SQL_OPT_TRACE 0(Off)固定。
ODBCドライバマネージャから返されるオプションです。
SQL_OPT_TRACEFILE NULL固定。
ODBCドライバマネージャから返されるオプションです。
SQL_TRANSLATE_DLL 設定できません。
SQL_TRANSLATE_OPTION 設定できません。
SQL_TXN_ISOLATION SQL_TXN_READ_UNCOMMITED
SQL_ASYNC_ENABLE SQL_ASYNC_ENABLE_OFF,又はSQL_ASYNC_ENABLE _ON

(3) ODBC関数の非同期実行のキャンセル

(a) 非同期実行をキャンセルするには

非同期実行中のODBC関数をキャンセルするには,SQLCancelを呼び出します。

SQLCancelは,指定されたhstmtが現在非同期実行中であることを確認できた時点で,サーバに対して処理のキャンセル要求をします。

SQLCancelの戻り値では,キャンセル要求が終了したかどうかを通知し,実際に非同期実行の関数がキャンセルされたかどうかは処理中の非同期実行の関数を呼び出して,その戻り値で判断します。関数が実行中の場合はSQL_STILL_EXECUTINGが返され,キャンセル処理が終了している場合はSQL_ERRORとSQLSTATE S1008(処理のキャンセル)が返されます。また,既に正常に終了していた場合や,ほかのエラーが発生した場合には,SQL_SUCCESSやSQL_ERRORなどのコードが返ります。

(b) マルチスレッドのアプリケーションプログラムでの非同期実行のキャンセル

マルチスレッドのアプリケーションプログラムでは,hstmtで同期実行しているODBC関数をキャンセルできます。キャンセルする場合,アプリケーションプログラムはキャンセルする関数に使用されているhstmtと同じhstmtで,異なるスレッドからSQLcancelを呼び出します。

SQLCancelの戻り値には,ドライバが要求を正しく受けたかどうかを表す値が返されます。また,元の関数の戻り値には,SQL_SUCCESS,又はSQL_ERRORとSQLSTATE S1008(処理のキャンセル)が返されます。

注意:
HiRDBのキャンセル処理は接続単位で実行され,いったんサーバとの接続が強制的に切断されます(サーバ側でKFPS00993-I:サーバプロセス終了REQUEST=clt_attentionが出力されます)。そのため,指定したhstmtに関連するhstmtの,すべてのステートメントがキャンセル(トランザクションはロールバック)されます。したがって,非同期実行中のODBC関数をキャンセルする場合,更新途中のデータを十分考慮する必要があります。

(4) コーディング例

非同期実行のコーディング例を次に示します。

 
  SQLSetStmtOption(hstmt,SQL_ASYNC_ENABLE,SQL_ASYNC_ENABLE_ON);
            :
    SQLFetchでの検索処理
  rc=SQLFetch(hstmt);
  while(rc==SQL_STILL_EXECUTING)
  {
           :
    非同期実行中 APの処理を続行
           :
      if(処理のキャンセル要求あり)
      {
          rc=SQL_Cancel(hstmt);
          if(rc==SQL_ERROR){  キャンセル要求失敗 エラー処理へ  }
      }
     rc=SQLFetch(hstmt);
  }
  if(rc == SQL_ERROR){   エラー処理へ  }
    検索データ加工処理へ
         :