XLAアプリケーションでトランザクション・ログの読取りを終了した後、監視中の表またはマテリアライズド・ビュー(あるいはその両方)をサブスクライブ解除し、コミットされていないトランザクションをロールバックし、すべてのハンドルを解放して、正常に終了する必要があります。プログラム終了時に、XLAブックマークを削除するかどうかは場合によります(「ブックマークの削除」を参照)。
リソースは、割当ての順序とは逆の順序で解放します。XLAによって追跡された表およびマテリアライズド・ビューの場合は、ttXlaTableStatus関数をコールし、newstatusパラメータを0(ゼロ)に設定します。これによって、表およびマテリアライズド・ビューがXLAからサブスクライブ解除されます。次に、ttXlaCloseをコールしてXLAハンドル(xla_handle)を解放します。
SQL_ROLLBACKを指定してSQLTransact関数をコールし、コミットされていないトランザクションをすべてロールバックします。次に、SQLDisconnectをコールしてTimesTenへの接続をクローズします。最後に、SQLFreeConnectおよびSQLFreeEnv関数をコールして、接続(hdbc)ハンドルおよび環境(henv)ハンドルを解放し、関連するすべてのメモリーを解放します。
たとえば、xlaSimple.c
デモのTerminateGracefully関数は、次のようになります。
void TerminateGracefully(int status)
{
SQLRETURN rc;
SQLINTEGER native_error ;
SQLINTEGER oldstatus;
SQLINTEGER newstatus = 0;
/* If the table has been subscribed to via 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);
}
XLAアプリケーションを終了する前に、ttXlaDeleteBookmark関数を使用して、XLAブックマークを削除できます。ブックマークは、前の接続がクローズされた後に新しい接続で再利用できます(「XLAブックマークについて」を参照)。この場合、新しい接続は、前の接続が停止した場所からトランザクション・ログの読取りを再開します。次に、ブックマークを削除した場合のメリットおよびデメリットを示します。
注意: | ブックマークを再利用する場合は、ログ・ファイル内の初期読取りLSNから開始します。ブックマークを再利用する接続で、現在の接続を切断した場所から読取りが開始されるようにするには、現在の接続を切断する前にttXlaAcknowledgeをコールして、ブックマークの位置を現在アクセスしているレコードに再設定する必要があります。 |
xlaSimple.c
デモのInitHandler関数は、終了時にXLAブックマークを削除します。
if (deleteBookmark) {
ttXlaDeleteBookmark(xla_handle);
if (rc != SQL_SUCCESS) {
/* 「XLAエラーの処理」 を参照 */
}
xla_handle = NULL; /* Deleting the bookmark has the */
/* effect of disconnecting from XLA. */
}
/* Close the XLA connection(「XLAアプリケーションの終了」 を参照 */