ヘッダーをスキップ
Oracle TimesTen In-Memory Database C開発者およびリファレンス・ガイド
リリース7.0
E05164-03
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

XLAアプリケーションの終了

XLAアプリケーションでトランザクション・ログの読取りを終了した後、監視中の表またはマテリアライズド・ビュー(あるいはその両方)をサブスクライブ解除し、コミットされていないトランザクションをロールバックし、すべてのハンドルを解放して、正常に終了する必要があります。プログラム終了時に、XLAブックマークを削除するかどうかは場合によります(「ブックマークの削除」を参照)。

リソースは、割当ての順序とは逆の順序で解放します。XLAによって追跡された表およびマテリアライズド・ビューの場合は、ttXlaTableStatus関数をコールし、newstatusパラメータを0(ゼロ)に設定します。これによって、表およびマテリアライズド・ビューがXLAからサブスクライブ解除されます。次に、 ttXlaClose をコールしてXLAハンドル(xla_handle)を解放します。

SQL_ROLLBACKを指定してSQLTransact関数をコールし、コミットされていないトランザクションをすべてロールバックします。次に、SQLDisconnectをコールしてTimesTenへの接続をクローズします。最後に、SQLFreeConnectおよびSQLFreeEnv関数をコールして、接続(hdbc)ハンドルおよび環境(henv)ハンドルを解放し、関連するすべてのメモリーを解放します。

例3.20

たとえば、xlaSimple.cデモのTerminateGracefully関数は、次のようになります。

void TerminateGracefully(int status)

{

  SQLRETURN     rc;

  SQLINTEGER    native_error ;

  SQLINTEGER    oldstatus;

  SQLINTEGER    newstatus = 0;

    

/* If the table has been subscribed to by XLA, unsubscribe it */

  if (SYSTEM_TABLE_ID != 0) {

    rc = ttXlaTableStatus(xla_handle, SYSTEM_TABLE_ID, 0,

                          &oldstatus, &newstatus);

    if (rc != SQL_SUCCESS) {

      /*「XLAエラーの処理」を参照 */

    }

    SYSTEM_TABLE_ID = 0;

  }

  /* Close the XLA connection. */

  if (xla_handle != NULL) {

    rc = ttXlaClose(xla_handle);

    if (rc != SQL_SUCCESS) {

      fprintf(stderr, "Error when disconnecting from XLA:<%d>",

              rc);

    }

    xla_handle = NULL;

  }

  /* Disconnect from TimesTen entirely. */

    

  if (hdbc != SQL_NULL_HDBC) {

    rc = SQLTransact(henv, hdbc, SQL_ROLLBACK);

    if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {

       /* 「XLAエラーの処理」を参照*/

    }

    rc = SQLDisconnect(hDbc);

    if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {

       /* 「XLAエラーの処理」を参照*/

    }

    rc = SQLFreeConnect(hDbc);

    if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {

      /* 「エラーのチェック」を参照*/

    }

    hdbc = SQL_NULL_HDBC;

  }

  if (henv != SQL_NULL_HENV) {

    rc = SQLFreeEnv(henv);

    if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {

      /* 「エラーのチェック」を参照*/

    }

    henv = SQL_NULL_HENV;

  }

  exit(status);

}