ヘッダーをスキップ
Oracle TimesTen In-Memory Database TTClassesガイド
リリース6.0
B25771-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

変更監視(XLA)クラス

TTClassesは、TimesTenのトランザクション・ログAPI(XLAともいいます)を使用するアプリケーションの作成を容易にするC++クラスのセットを備えています。XLAはコール可能なC関数のセットであり、アプリケーションはこれによってTimesTenデータ・ストア内の1つ以上の表の変更を監視できます。監視対象の表が別のアプリケーションによって変更されるたびに、XLAを使用しているアプリケーションにその変更が通知されます。

TTClassesは、XLAアプリケーションの作成を簡素化するクラスのセットを備えています。次に、そのクラスを示します。

TTXlaConnection

TTXlaConnectionは、XLAで使用できるTTConnectionのラッパーです。標準TTConnectionと共通の基本メソッド(Connect、Disconnectなど)を備えていますが、一般にTTConnectionのかわりには使用できません。TTXlaConnectionは、XLA操作専用のTimesTenへの接続です。

TimesTenデータ・ストアに同時に接続できるTTXlaConnectionオブジェクトは1つのみです。

パブリック・メンバー

なし

パブリック・メソッド

virtual void Connect (const char* connStr, TTStatus&)

Connectメソッドは、TimesTenデータ・ストアへの新しいXLA接続を開くために使用されます。connStrパラメータで指定された接続文字列を使用して接続が作成されます。

virtual void Disconnect (TTStatus&)

Disconnectメソッドは、TimesTenデータ・ストアとのXLA接続を閉じるために使用されます。

void setXlaBufferSize (SQLUBIGINT newsz, SQLUBIGINT* oldszP, TTStatus&)

TimesTen Databaseがアプリケーションによって変更されると、XLAが有効になっているアプリケーションがデータをフェッチできるまで、その変更を記述する情報が共有メモリー・バッファに格納されます。setXlaBufferSizeメソッドを使用すると、特定のデータ・ストアについてこのバッファのサイズを設定できます。このメソッドは、TTXlaConnectionオブジェクトがConnectメソッドによってデータベースに接続された後にのみ使用できます。

データ・ストアの作成時には、XLAバッファのデフォルトのサイズは0(ゼロ)です。その結果、XLAが無効になります。このメソッドによってバッファが定義されるまで、アプリケーションはXLAを使用できません。

このバッファのサイズは、一度設定されると永続的にデータベース内に格納されます。電力障害または他のシステム障害によってデータベースがメモリーに再ロードされても、バッファ・サイズは、最後のsetXlaBufferSizeメソッドのコールでの定義に従って再ロード時に設定されます。

このメソッドのコール元は、XLAバッファの新しいサイズを(バイト単位で)指定します。以前のバッファ・サイズは、oldP引数を介してコール元に返されます。エラーが発生した場合は、TTStatus引数を介してエラーが報告されます。

void fetchUpdates (ttXlaUpdateDesc_t*** arry, int maxrecs, int* recsP, TTStatus&)

fetchUpdates()メソッドは、データ・ストアの変更を記述したレコードのセットをフェッチするために、XLAアプリケーションで使用されます。ttXlaUpdateDesc_t構造体のリストが返されます。コール元は、受信するレコードの最大数を指定します。メソッドが返されると、コール元は実際に返されたレコードの数と、変更を定義している構造体を指すポインタの配列を受信します。

このメソッドによって返されるttXlaUpdateDesc_t構造体は、XLA仕様で定義されたものです。これらのメソッドのC++オブジェクト指向カプセル化は提供されません。ただし、この章の他のクラスも参照してください。このメソッドによって返されるttXlaUpdateDesc_t構造体のデコードに役立ちます。

ttXlaHandle_t getXlaHandle()

アプリケーションで、C++カプセル化を含まないXLA機能を使用する必要がある場合、この接続の基礎となるttXlaHandle_t値をこのメソッドによって返すことができます。この値は低レベルのXLA関数によって使用されます。

使用方法

XLAアプリケーションでは、TTXlaConnectionオブジェクトを1つのみ作成し、Connectメソッドを使用してそれをデータ・ストアに接続する必要があります。オブジェクトが接続されたら、setXlaBufferSizeメソッドを使用してXLAを有効にします。

XLAが有効になると、アプリケーションはその終了までfetchUpdates()メソッドを繰り返しコールするループに入る必要があります。このループでは、XLAバッファが一杯にならないよう、できるだけ速くXLAから更新をフェッチする必要があります。XLAバッファが一杯になると、他のすべてのアプリケーションによるその後のデータベースへの変更が拒否されます。他のアプリケーションまたは他のスレッドでは、負荷の高い処理の実行が遅延されることになります。

最後に、アプリケーションの終了時に、setXlaBufferSizeメソッドを使用してXLAバッファのサイズを以前の値に設定することをお薦めします。これは、オブジェクトのDisconnectメソッドをコールする前に実行する必要があります。

TTXlaPersistConnection

TTXlaPersistConnectionは、永続XLAで使用されるTTXlaConnectionのラッパーです。標準TTXlaConnection(永続XLAでは無意味であるsetXlaBufferSize()を除く)のすべての機能に加え、永続XLAに関連する追加機能も備えています。

永続XLAと非永続XLAの1つの大きな違いは、1つのTimesTenデータ・ストアに複数のTTXlaPersistConnectionオブジェクトを同時に接続できる点であることに注意してください。したがって、永続XLAはマルチユーザーXLAでもあります。

パブリック・メンバー

なし

パブリック・メソッド

virtual void Connect (const char* connStr, const char * bookmark, bool createBookmark, TTStatus&);

TTXlaPersistConnection::Connect()メソッドのシグネチャはTTConnection::Connect(およびTTXlaConnection::Connect)と異なります。永続XLAをサポートするために、データ・ストアの接続時に追加情報を提供する必要があるためです。

追加パラメータはbookmark (const char*)およびcreateBookmark (bool)です。

各永続XLA接続には、接続の切断時と再接続時にトランザクション・ログ内の同じ位置を検出できるように、名前(またはブックマーク)が関連付けられます。接続のブックマークの名前は、bookmarkパラメータによって指定されます。

注意: 特定のブックマーク名で接続できるXLA接続は1つのみです。複数の接続が同じブックマークに接続しようとすると、エラーが返されます。

これが新しいブックマークであるか、以前に作成されたブックマークであるかは、ブール値のパラメータcreateBookmarkによって指定されます。新規(createBookmark==true)として指定したブックマークがすでに存在する場合は、エラーが返されます。同様に、既存(createBookmark==false)として指定したブックマークがまだ存在していない場合にも、エラーが返されます。

virtual void Connect (const char* connStr, const char * bookmark, TTStatus&

この第2のConnectメソッドでは、まず指定されたブックマークを使用して接続が試行され、それを再利用して(createBookmarkの暗黙値==false)接続が試行されます。そのブックマークが存在しない場合は、接続およびbookmarkという名前の新規ブックマークの作成(createBookmarkの暗黙値==true)が試行されます。

このメソッドは、XLAブックマークが存在するかどうかを開発者が気にかけたくない場合に備えて、XLA接続ロジックを簡素化するために便宜上提供されているものです。

ブックマークの保守は、次の4つのメソッドにおける項目です。

void deleteBookmark (TTStatus&)

このメソッドでは、現在添付されているブックマークが削除され、そのブックマークに関連するレコードがデータ・ストア内に保持されなくなります。

ブックマークがないとTTXlaPersistConnectionが有効でなくなるため、このメソッドをコールするとTTXlaPersistConnection::Disconnect()も暗黙的にコールされることに注意してください。

したがって、単にデータ・ストアから切断する場合は、TTXlaPersistConnection::Disconnect()を使用します。添付されているブックマークを削除する(ブックマークに関連する更新レコードがデータ・ストア内で追跡されることを回避する)場合に、TTXlaPersistConnection::deleteBookmark()を使用します。

void ackUpdates (TTStatus &)

このメソッドは、ブックマークを次の更新セットに進めるために使用されます。特定のブックマークについて更新セットを一度確認(ackUpdates)したら、それらをそのブックマークで再度参照することはできません。更新セットを複数回再生可能にするために使用される、次の2つのメソッドを参照してください。

void getBookmarkIndex (TTStatus &)
void setBookmarkIndex (TTStatus &)

各ttXlaPersistConnectionでは、何度でもレコードのバッチを再生できるように、ブックマーク内のブックマークが保守されます。getBookmarkIndex()メソッドを使用してトランザクション・ログ内での現在の位置を格納し、setBookmarkIndex()メソッドを使用して保存したトランザクション・ログ索引に戻ります。

ackUpdates()がコールされると、格納されているトランザクション・ログ・プレースホルダが無効になることに注意してください。つまり、ackUpdates()の後でsetBookmarkIndex()がコールされても、以前のトランザクション・ログ索引まで戻ることができないため、エラーが返されます。

更新を複数回再生する機能が必要となることがあるアプリケーションもありますが、ほとんどのアプリケーションでは、おそらくこの機能は必要ないことに注意してください。

void fetchUpdatesWait (ttXlaUpdateDesc_t*** arry, int maxrecs, int* recsP, int seconds, TTStatus&)

これはTTXlaConnection::fetchUpdates()メソッドのブロッキング・バージョンです。5番目のパラメータ(seconds: 更新の待機時間)が指定される点を除いて、fetchUpdate()とほぼ同様に使用されます。

ユーザー・アプリケーションは、このメソッドを使用することで、nanosleep()の明示的なコールを記述するかわりに、更新の有無のポーリング・ループをTimesTenエンジン内に出力できます。実際、最終的な効果はほとんど同じです。

このメソッドの入力、出力および使用方法の詳細は、「TTXlaConnection::fetchUpdates()」を参照してください。

使用方法

TTXlaPersistConnection()は、いくつかの小さな相違点を除いて、TTXlaConnectionとほぼ同様に使用されます。

TTXlaTable

TTXlaTableオブジェクトは、変更の有無が監視されている表についての情報を定義します。

パブリック・メンバー

TTXlaColumn col[TT_XLA_MAX_COLUMNS]

colメンバーは、表内の列ごとに1つ、TTXlaColumnオブジェクトの配列を定義します。これらのオブジェクトは、この表の各列の名前と型に関する情報を保持します。

パブリック・メソッド

void Define (TTXlaConnection* const char* owner, const char* name, TTStatus&)

このメソッドは、このTTXlaTableオブジェクトをデータ・ストア内の特定の名前の表に関連付けます。このメソッドの入力パラメータは、データ・ストアへの接続、表の所有者の名前および表自体の名前を指定します。所有者名の指定は必須であり、デフォルト設定はありません。

このメソッドによって、この表に関連付けられたカタログ情報がデータ・ストアからフェッチされ、TTXlaTableオブジェクトに移入されます。

int getNCols()

このメソッドは表の列数を返します。

int getColNumber (const char* colName)

このメソッドを使用して、特定の名前の列を列番号にマッピングできます。TTXlaRowViewerの様々なバージョンと組み合せて使用すると、列名によって列の値をフェッチできるため、特に有効です。

void enableTracking (bool* oldValue, TTStatus&)

このメソッドをコールすると、XLAによるこの表の変更追跡が有効になります。このメソッドがコールされるまでは、XLAによってこの表の変更を取得できません。

このメソッドにより、この表の変更追跡が有効になり、変更追跡の以前の状態が返されます。

TimesTen Databaseにおける表の追跡状態は永続的であることに注意してください。電力障害または他のシステム障害によってデータ・ストアがディスクからRAMに再ロードされても、表のXLA対応状態は保持されます。

void disableTracking (bool* oldValue, TTStatus&)

このメソッドをコールすると、XLAによるこの表の変更追跡が無効になります。このメソッドがコールされたあとは、XLAによってこの表の変更を取得できません。

このメソッドにより、この表の変更追跡が無効になり、変更追跡の以前の状態が返されます。

TimesTen Databaseにおける表の追跡状態は永続的であることに注意してください。電力障害または他のシステム障害によってデータ・ストアがディスクからRAMに再ロードされても、表のXLA対応状態は保持されます。

void setTracking (bool newValue, TTStatus&)

このメソッドをコールすると、XLAによるこの表の変更追跡が有効または無効になります。newValueがtrueの場合は追跡が有効になり、falseの場合は無効になります。

このメソッドは、enableTrackingまたはdisableTrackingが以前に使用されていて、表の追跡状態をその前の値に戻したい場合に使用すると便利です。

TimesTen Databaseにおける表の追跡状態は永続的であることに注意してください。電力障害または他のシステム障害によってデータ・ストアがディスクからRAMに再ロードされても、表のXLA対応状態は保持されます。

使用方法

1つ以上の表の変更を追跡しているXLAアプリケーションは、監視する表ごとにTTXlaTableオブジェクトを作成し、Defineメソッドをコールして各表を定義する必要があります。後の例でわかるとおり、表の変更を記述するXLAレコードが処理される際に、これらのTTXlaTableオブジェクトは変更内容の解釈において有効となります。

TTXlaColumn

このオブジェクトは表内の1つの列を定義します。

パブリック・メンバー

なし

パブリック・メソッド

int getType()

列のODBC型(SQL_INTEGER、SQL_CHARなど)を返します。

const char* getColName()

列の名前を返します。

SQLULEN getPrecision()

列の数値精度を返します。DECIMAL列に対してのみ意味があります。

int getScale()

列の数値スケールを返します。DECIMAL列に対してのみ意味があります。

SQLUINTEGER getSysColNum()

列のシステム列番号を返します。

SQLUINTEGER getUserColNum()

XLAによって指定される、列のユーザー列番号を返します。この番号はXLAアプリケーションでは頻繁に使用されません。

SQLUINTEGER getSize()
SQLUINTEGER getOffset()
SQLUINTEGER getNullOffset()
SQLUINTEGER getFlags()

これらの4つのメソッドは、XLA更新通知レコードを解析する際には重要だが通常はXLAアプリケーションで使用されない列情報を返します。TTXlaRowViewer::Get()メソッドを使用した方が、更新通知レコードをはるかに簡単に調べることができます。

void Define (ttXlaColDesc_t* colP, TTStatus& stat)

TTXlaColumnオブジェクトに、特定の表の特定の列に関するカタログ情報が移入されます。

通常、アプリケーションはこのメソッドをコールしません。このメソッドは表内の各列でTTXlaTable::Defineによって自動的に起動されます。

使用方法

TTXlaColumnオブジェクトおよびメソッドは、監視している表のスキーマを理解する必要のあるアプリケーションに有効です。アプリケーションでは、TTXlaTableオブジェクトで保守されるTTXlaColumnオブジェクトのcol配列を介して、簡単にこの情報にアクセスできます。

TTXlaRowViewer

TTXlaRowViewerクラスは、アプリケーション開発者がXLA変更通知レコードの構造を調べ、新旧の列値をフェッチできる強力なクラスです。

行を調べるには、TTXlaRowViewerオブジェクトを表(settableメソッドを介して)および行(setTupleメソッドを介して)に関連付ける必要があります。表は事前に定義されたTTXlaTableオブジェクトです。行は、TTXlaConnection::fetchUpdatesメソッドを介してXLAによって返されるttXlaUpdateDesc_t構造体の一部です。

パブリック・メンバー

なし

パブリック・メソッド

void setTable (TTXlaTable*)

このTTXlaRowViewerを特定の表に関連付けます。

void setTuple (ttXlaUpdateDesc_t*, int whichTuple)

このTTXlaRowViewerオブジェクトを特定の行イメージに関連付けます。

TTXlaConnection::fetchUpdatesによって返されるttXlaUpdateDesc_t構造体には、0(ゼロ)、1または2つの行が含まれます。

bool isNull (int whichCol)

行イメージ内の特定の列がNULLである(trueを返す)かNULLでない(falseを返す)かを示します。

whichColパラメータは、問い合せる列の列番号です。この列番号を取得する簡単な方法は、特定の名前の列の列番号を返すTTXlaTable::getColNumberメソッドを使用することです。

void Get (int col, ...)

行イメージ内の特定の列の値をフェッチします。

これらのメソッドはTTCmd::getColumn()メソッドによく似ています。

colパラメータは、問い合せる列の列番号です。この列番号を取得する簡単な方法は、指定された列名の列番号を返すTTXlaTable::getColNumberメソッドを使用することです。

次の表に、サポートされるSQLデータ型と、各パラメータ型での使用に適したGetのバージョンを示します。

表4: サポートされるSQLデータ型に対するTTXlaRowViewer::Getのバージョン

SQLデータ型

サポートされるGetのバージョン

SQL_TINYINT

Get (int, SQLTINYINT*)

SQL_SMALLINT

Get (int, short*)

SQL_INTEGER

Get (int, int*)

SQL_LONG

<現在はサポートされていません>

SQL_BIGINT

Get (int, SQLBIGINT*)

SQL_FLOAT

Get (int, float*)

SQL_DOUBLE

Get (int, double*)

SQL_DECIMAL

Get (int, char**)

SQL_NUMERIC

Get (int, char**)

SQL_CHAR

Get (int, char**)

SQL_VARCHAR

Get (int, char**)

SQL_WCHAR

Get (int, SQLWCHAR**, int * len)

SQL_WVARCHAR

Get (int, SQLWCHAR**, int * len)

SQL_BINARY

Get (int, const void**, int * len)

SQL_VARBINARY

Get (int, const void**, int * len)

SQL_DATETIME

Get (int, TIMESTAMP_STRUCT*)

SQL_TIMESTAMP

Get (int, TIMESTAMP_STRUCT*)

SQL_DATE

Get (int, DATE_STRUCT*)

SQL_TIME

Get (int, TIME_STRUCT*)

使用方法

これはXLAクラスの中心的なクラスです。これは、変更通知レコードに含まれる行イメージから列値をフェッチするために使用されます。

TTXlaTableHandler

TTXlaTableHandlerクラスは、アプリケーション開発者が特定の表の変更を処理するカスタマイズ済クラスを記述する際の基本クラスです。

パブリック・メンバー

なし

保護メンバー

TTXlaTable tbl;

処理対象の表に関連付けられたTTXlaTableオブジェクト。

TTXlaRowViewer row;

HandleChange、HandleDelete、HandleInsertおよびHandleUpdateメソッド(後述)内でこのRowViewerオブジェクトを使用して、挿入または削除された行、あるいは変更されている行の古いイメージを表示できます。

TTXlaRowViewer row2;

HandleChange、HandleDelete、HandleInsertおよびHandleUpdateメソッド(後述)内でこのRowViewerオブジェクトを使用して、更新されている行の新しいイメージを表示できます。

パブリック・メソッド

TTXlaTableHandler (TTXlaConnection& conn, const char* ownerP, const char* nameP)

このTTXlaRowViewerを特定の表に関連付けます。このオブジェクトに含まれるTTXlaTableオブジェクトを初期化します。

virtual void EnableTracking (TTStatus&);

このメソッドでは、基礎となる表のXLA更新追跡が有効になります。このメソッドがコールされるまでは、XLAによってこの表の変更に関する情報が返されません。

virtual void DisableTracking (TTStatus&);

このメソッドでは、基礎となる表のXLA更新追跡が無効になります。このメソッドがコールされた後は、XLAによってこの表の変更に関する情報が返されません。

virtual void HandleChange (ttXlaUpdateDesc_t*, void* pData = 0);

このメソッドを使用すると、ttXlaUpdateDesc_tを適切な処理ルーチンにディスパッチして処理できます。更新記述が分析され、それが削除、挿入または更新のどれであるか判別されます。その後、適切な仮想メソッド(HandleDelete、HandleInsertまたはHandleUpdate)がコールされます。

pDataパラメータの使用方法は、「トランザクション境界におけるXLA更新の確認」を参照してください。

virtual void HandleDelete (ttXlaUpdateDesc_t*) = 0;

このメソッドは、削除操作を処理するためにHandleChangeメソッドがコールされるたびに起動されます。

このメソッドはTTXlaTableHandler基本クラスには実装されませんが、TTXlaTableHandlerから導出される任意のクラスで提供される必要があります。アプリケーション開発者は、削除される行を処理するロジックをこのメソッドに配置する必要があります。

表から削除された行は、rowという名前のRowViewerによって取得できます。

virtual void HandleInsert (ttXlaUpdateDesc_t*) = 0;

このメソッドは、挿入操作を処理するためにHandleChangeメソッドがコールされるたびに起動されます。

このメソッドはTTXlaTableHandler基本クラスには実装されませんが、TTXlaTableHandlerから導出される任意のクラスで提供される必要があります。アプリケーション開発者は、挿入される行を処理するロジックをこのメソッドに配置する必要があります。

表から削除された行は、rowという名前のRowViewerによって取得できます。

virtual void HandleUpdate (ttXlaUpdateDesc_t*) = 0;

このメソッドは、更新操作を処理するためにHandleChangeメソッドがコールされるたびに起動されます。

このメソッドはTTXlaTableHandler基本クラスには実装されませんが、TTXlaTableHandlerから導出される任意のクラスで提供される必要があります。アプリケーション開発者は、更新される行を処理するロジックをこのメソッドに配置する必要があります。

表で更新された行の古いバージョンはrowという名前のRowViewerによって取得でき、行の新しいバージョンはrow2によって取得できます。

void generateSQL (ttXlaUpdateDesc_t*, char * buffer, SQLINTEGER maxLen, SQLINTEGER *actualLen, TTStatus &);

このメソッドを使用して、特定のXLAレコードに関連付けられたSQLを出力できます。SQL文字列はbufferパラメータによって返されます。このパラメータは、このメソッドのコール元が領域を割り当て、maxLenパラメータで長さを指定したパラメータです。パラメータactualLenは、返されるSQL文字列の実際の長さに関する情報を返します。

生成されたSQL文字列よりmaxLenが小さい場合は、TTStatusエラーが返され、バッファの内容とactualLenは変更されません。

TTClassesデモ・プログラム< demo/ttclasses/xlademo.cpp >は、このメソッドの使用方法を示します。

使用方法

アプリケーション開発者は、TTXlaTableHandlerから1つ以上のクラスを導出し、そのクラスのHandleInsert、HandleDeleteおよびHandleUpdateメソッドに、アプリケーションのロジックのすべてでなくても大部分を配置することが期待されています。

1つの方法は、1つの表につき1つずつ、このクラスから複数のクラスを導出することです。たとえば、顧客の変更を処理するビジネス・ロジックをCustomerTableHandlerクラスに実装し、注文の変更を処理するビジネス・ロジックをOrderTableHandlerクラスに実装します。

もう1つの方法は、様々な使用例を処理する1つ以上の汎用クラスをこのクラスから導出することです。たとえば、このクラスから導出した汎用クラスを使用して、パブリッシュ/サブスクライブ・システムを介して変更をパブリッシュできます。

TTXlaTableList

TTXlaTableListクラスは、更新通知イベントを適切なTTXlaTableHandlerにディスパッチするために使用されます。このクラスでTableHandlerオブジェクトのリストが保守されます。更新通知がXLAから受信されると、適切なTableHandlerの適切なHandleメソッドがコールされ、各レコードを処理します。

たとえば、CustomerTableHandler型のオブジェクトが表CUSTOMERの変更を処理し、OrderTableHandler型のオブジェクトが表ORDERSの変更を処理する場合、アプリケーションでは両方のオブジェクトをTTXlaTableListに含める必要があります。XLA更新通知レコードがXLAからフェッチされたとき、TTXlaTableList::HandleChangeをコールするだけで、それらのレコードを適切なハンドラにディスパッチできます。

パブリック・メンバー

なし

パブリック・メソッド

(constructor) TTXlaTableList (TTXlaConnection* cP);

TableListの作成に使用されます。cPパラメータは、XLA操作に使用するデータベース接続を参照します。

void add (TTXlaTableHandler* h);

リストにTableHandlerを追加するために使用されます。

void del (TTXlaTableHandler* h);

リストからTableHandlerを削除するために使用されます。

void HandleChange (ttXlaUpdateDesc_t* p, TTStatus&);

XLAからttXlaUpdateDesc_tを受信したとき、このメソッドをコールしてそれを処理できます。このメソッドは、レコードが参照する表を特定し、適切なTableHandlerのHandleChangeメソッドをコールします。

使用方法

TableHandlerオブジェクトをTableListに登録すると、XLAから更新通知レコードをフェッチし、適切なメソッドにディスパッチして処理するプロセスを、非常に簡単なループによって実行できます。