TTClassesクラスの使用
この項では、TTClassesライブラリの各クラスの使用方法についての追加情報を示します。
一般的に使用されるクラスの使用方法
この項では、TTClassesライブラリで一般的に使用されるクラスについて、それぞれの使用方法を説明します。
TTCGlobalの使用方法
TTGlobal
クラスは、TTClassesのロギング機能を提供します。
このロギング機能は、TTClassesプログラム内で発生する問題のデバッグに非常に役立つことがあります。ただし、冗長度の高いロギング・レベル(TTLog::TTLOG_INFO
およびTTLog::TTLOG_DEBUG
)の場合は、膨大な出力が生成される可能性があることに注意してください。これらのロギング・レベルは、開発時または不具合の診断時に使用してください。これらは、多くの本番環境には適していません。
マルチスレッド・プログラムからロギングを行う際、ファイル・システムへの書込み時に、プログラムの別スレッドからのログ出力が入り混じる問題が発生する場合があります。この問題を軽減するには、次の例のように、ios_base::unitbuf
I/Oストリーム・マニピュレータを使用してostream
バッファリングを無効にし、TTClassesのロギングがロギング・レベルTTLog::TTLOG_ERR
でapp_log.txt
ファイルに送信されるようにします。
ofstream log_file("app_log.txt");
log_file << std::ios_base::unitbuf;
TTGlobal::setLogStream(log_file);
TTGlobal::setLogLevel(TTLog::TTLOG_ERR);
TTGlobal
の詳細は、TTClassesロギングの使用およびTTGlobalリファレンスを参照してください。
TTCStatusの使用方法
TTStatus
クラスは、TTClassesライブラリ内の他のクラスで、エラーおよび警告の例外を捕捉するために使用されます。TTStatus
は、ODBC関数SQLError
の付加価値C++ラッパーと考えることができます。
エラーまたは警告が発生するとTTStatus
オブジェクトが例外としてスローされます。これによって、C++アプリケーションで{try/catch}
ブロックによる障害の検出とリカバリが可能となります。
...
TTCmd myCmd;
try {
myCmd.ExecuteImmediate(&conn, "create table dummy (c1 int)");
}
catch (TTStatus st) {
cerr << "Error creating table: " << st << endl;
// Rollback, exit(), throw -- whatever is appropriate
}
...
TTStatusには、TTError
とTTWarning
の2つのサブクラスがあります。ODBC警告(たとえば、RETURN RECEIPT警告)は、通常ODBCエラーほど重大ではないので、一般的は別のロジックを使用して処理する必要があります。ODBCエラーは、プログラムを記述して処理する必要があります。プログラムによるODBC警告の処理が保証される場合もありますが、通常は単純にログに記録するだけで十分です。
この例では、TTError
とTTWarning
の使用方法を示します。ODBCエラーでは、TTError
オブジェクトがスローされます。ODBC警告では、TTWarning
オブジェクトがスローされます。
// catching TTError & TTWarning exceptions
try {
// some TTClasses method calls
}
catch (TTWarning warn) {
cerr << "Warning encountered: " << warn << endl;
}
catch (TTError err) {
// handle the error; this could be a serious problem
}
ノート:
TimesTenではほとんどの一時エラーが自動的に解決されますが(これはTimesTen Scaleoutでは特に重要)、odbc_error
属性をとおしてアプリケーションによって検出されたエラーがTT005
のSQL状態を示している場合は、現在のトランザクションを再試行することをお薦めします。Oracle TimesTen In-Memory Database C開発者ガイドの一時エラー(ODBC)を参照してください。
TTStatusリファレンスも参照してください。
TTConnectionの使用方法
TTConnection
クラスは、データベースに対する接続という概念をカプセル化します。TTConnection
は、ODBC接続ハンドル(SQLHDBC
)の付加価値C++ラッパーと考えることができます。TimesTenを使用するすべてのアプリケーションは、1つ以上のTTConnection
オブジェクトを作成する必要があります。
同時に複数のスレッドからTimesTenを使用するマルチスレッド・アプリケーションでは、TTConnection
オブジェクトを複数作成する必要があります。次のいずれかの方法を使用します。
-
スレッドの作成時に、各スレッドに1つの
TTConnection
オブジェクトを作成します。 -
アプリケーション・プロセスの開始時に、
TTConnection
オブジェクトのプールを作成します。それらはプロセス内の複数のスレッドで共有されます。TTConnectionPoolの使用方法を参照してください。
TimesTen接続は、親プロセスから継承できません。プロセスが、子プロセスを作成する(分岐)前にデータベース接続を開いた場合、子が同じ接続を使用することはできません。子が親のデータベース接続を使用しようとすると、アプリケーションが失敗したりコア・ダンプが発生する場合があります。
接続および切断は、比較的負荷の高い操作であるため、アプリケーションでは頻繁にデータベース接続を行ったり、切断しないようにする必要があります。また、短期間の接続では準備済文のメリットがなくなります。そのかわりに、アプリケーション・プロセスの開始時にデータベース接続を確立し、そのプロセスの存続中はそれを再利用します。
ヒント:
基礎となるODBC接続オブジェクトを直接操作する必要がある場合は、TTConnection::getHdbc()
メソッドを使用します。
データベースに接続する権限は、CREATE SESSION
権限を使用して、直接またはPUBLIC
ロールを介してユーザーに付与する必要があります。接続メソッドを参照してください。
TTCmd、TTConnectionおよびTTConnectionPoolの使用およびTTConnectionリファレンスも参照してください。
TTConnectionPoolの使用方法
TTConnectionPool
クラスは、マルチスレッド・アプリケーションによって、接続のプールの管理に使用されます。
通常、マルチスレッド・アプリケーションは次のいずれかの方法を使用して作成します。
-
スレッドの数が相対的に少なく、さらにスレッドの存続時間が長い場合は、アプリケーションの存続期間中使用される、異なる接続に各スレッドを割り当てることができます。この使用例では、
TTConnectionPool
クラスは必要ありません。 -
プロセス内のスレッドの数が多い場合、またはスレッドの存続時間が短い場合は、アイドル状態の接続のプールを確立します。これらの接続は、アプリケーションの存続期間使用されます。スレッドは、データベース・トランザクションを実行する必要がある場合、プールからアイドル状態の接続を確認し、そのトランザクションを実行して、接続をプールに返します。これは、
TTConnectionPool
クラスを使用した使用例です。
コンストラクタには2種類の形式があります。
TTConnectionPool()
または
TTConnectionPool(const int size);
このsize
では、プールの最大接続数を指定します。これを指定しないと、最大接続数は128です。size
設定を指定する場合、TimesTenのConnections
属性に設定されている最大接続数よりも大きな値を指定するすると、接続数がConnections
の値を超えたときにエラーが発生することに注意してください。Oracle TimesTen In-Memory Databaseリファレンスの接続も参照してください。
ヒント:
全体のパフォーマンスを最高にするには、データベース・サーバーのCPUごとにデータベースへの同時直接接続が1つか2つあるようにすることが推奨されます。同時直接接続の数(接続プールのサイズ)は、データベース・サーバーのCPU数の2倍は超えないようにしてください。ただし、クライアント/サーバー接続では、CPUごとにさらに多くの接続が効率的にサポートされます。
アプリケーションは、TTConnectionPool
クラスを使用するために、クラスの単一のインスタンスを作成します。その後、TTConnectionクラスまたはユーザー・クラスのいずれかのインスタンスである
TTConnectionを拡張するオブジェクトをいくつか作成しますが、これではその
Connect()
メソッドは直接にはコールしません。かわりに、アプリケーションではTTConnectionPool::AddConnectionToPool()
メソッドを使用し接続オブジェクトをプールに配置し、その後TTConnectionPool::ConnectAll()
をコールし、TimesTenへのすべての接続を確立します。バックグラウンドでは、ConnectAll()
が、そのConnect()
メソッドをコールするためにすべてのTTConnection
オブジェクト間をループします。
TimesTenアプリケーションのスレッドは、getConnection()
メソッドとfreeConnection()
メソッドを使用し、アイドル状態の接続を取得および返します。
ヒント:
TTConnectionPool
を使用してTTConnection
を拡張する場合、コール・シーケンスにdriverCompletion
が含まれるTTConnection::Connect()
メソッドは、それに対応するTTConnectionPool::ConnectAll()
メソッドが存在しないため、オーバライドしないでください。かわりに、次のいずれかのConnect()
メソッドをオーバーライドします。
virtual void Connect(const char* connStr)
virtual void Connect(const char* connStr, const char* username,
const char* password)
その後、適切な対応するConnectAll()
メソッドを使用します。
データベースに接続する権限は、CREATE SESSION
権限を使用して、直接またはPUBLIC
ロールを介してユーザーに付与する必要があります。接続メソッドを参照してください。
TTCmd、TTConnectionおよびTTConnectionPoolの使用およびTTConnectionPoolリファレンスも参照してください
TTCmdの使用方法
TTCmd
オブジェクトは、アプリケーション・プログラムで複数回使用される単一のSQL文をカプセル化します。TTCmd
は、ODBC文ハンドル(SQLHSTMT
)の付加価値C++ラッパーとみなすことができます。TTCmd
には、次の3種類のパブリック・メソッドがあります。
プログラムで複数回実行される各SQL文には、独自のTTCmd
オブジェクトが必要です。これらのTTCmd
オブジェクトは、プログラムの初期化時にそれぞれ1回準備され、プログラムの実行時にExecute()
メソッドで複数回実行されます。
ExecuteImmediate()
メソッドは、少数回のみ実行する必要のあるデータベース操作でのみ使用します。ExecuteImmediate()
はどのタイプのSELECT
文とも互換性がないことに注意してください。かわりに、すべての問合せでPrepare()
とExecute()
を使用する必要があります。また、ExecuteImmediate()
は、後で、挿入、更新または削除された行数を調べるために、getRowcount()
を使用してポーリングされるINSERT
、UPDATE
またはDELETE
文とも互換性がありません。これらの制限は、一部の特別な状況(表の作成または削除など)を除き、ExecuteImmediate()
の使用を避けるために課されています。
ノート:
-
いくつかの
TTCmd
メソッドは、ODBCドライバ・マネージャとともに使用するとエラーを返します。詳細は、ODBCドライバ・マネージャ使用時の考慮事項(Windows)を参照してください。 -
基礎となるODBC文を直接操作する必要がある場合は、
TTCmd::getHandle()
メソッドを使用してください。
TTCmd、TTConnectionおよびTTConnectionPoolの使用およびTTCmdリファレンスも参照してください。
システム・カタログ・クラスの使用方法
この項では、TTClassesシステム・カタログ・クラスについて、それぞれの使用方法を説明します。
TTCatalogの使用方法
TTCatalog
クラスは、データベース内の表に関するメタデータ情報へのプログラム的なアクセスに使用される、トップ・レベルのクラスです。このクラスを使用すると、システム・カタログからのメタデータの読取りが容易になります。TTCatalog
オブジェクトのデータが構造には、読み取られた情報が含まれます。
TTCatalog
オブジェクトを使用するには、そのオブジェクトのfetchCatalogData()
メソッドをコールします。fetchCatalogData()
メソッドは、データベース接続を使用するTTCatalog
の唯一のメソッドです。その他のメソッドは、単純にfetchCatalogData()
から取得したデータを返します。
TTCatalog
オブジェクトの内部には、TTCatalogTable
オブジェクトの配列があります。クラス・コンストラクタを除くTTCatalog
のすべてのパブリック・メソッドを使用して、そのTTCatalogTable
配列への読取り専用アクセスを取得します。
TTCatalog
コンストラクタは、conn
パラメータをキャッシュして、すべての内部データ構造を適切に初期化します。
TTCatalog (TTConnection* conn)
TTCatalog
内では次のODBC関数が使用されます。
-
SQLTables()
-
SQLColumns()
-
SQLSpecialColumns()
-
SQLStatistics()
TTCatalogリファレンスも参照してください。
TTCatalogTableの使用方法
最上位レベルのTTCatalog
クラスの各オブジェクト内には、TTCatalogTable
オブジェクトの配列が含まれます。
TTCatalogTable
オブジェクトはTTCatalog::getTable()
メソッドを使用して取得され、表の列および索引に関するメタデータ情報がすべて格納されます。
各TTCatalogTable
オブジェクトには、TTCatalogColumn
オブジェクトの配列と、TTCatalogIndex
オブジェクトの配列が含まれます。
TTCatalogTableリファレンスも参照してください・
TTCatalogColumnの使用方法
各TTCatalogTable
オブジェクトには、TTCatalogColumn
オブジェクトの配列と、TTCatalogIndex
オブジェクトの配列が含まれます。
TTCatalogColumn
クラスは、表の1つの行のすべてのメタデータ情報を格納するために使用されます。この表はTTCatalogTable
オブジェクトで表現され、このオブジェクトからTTCatalogTable::getColumn()
コールを使用して列が取得されています。
TTCatalogColumnリファレンスも参照してください。
TTCatalogIndexの使用方法
各TTCatalogTable
オブジェクトには、TTCatalogColumn
オブジェクトの配列と、TTCatalogIndex
オブジェクトの配列が含まれます。
TTCatalogIndex
クラスは、表の索引のメタデータ情報を保存するために使用されます。この表は、TTCatalogTable
オブジェクトで表現され、このオブジェクトからTTCatalogTable::getIndex()
コールを使用して索引が取得されています。
TTCatalogIndexリファレンスも参照してください。
TTCatalogSpecialColumnの使用方法
該当するTTCatalogTable
オブジェクトでgetSpecialColumn()
メソッドをコールし、TTCatalogSpecialColumn
オブジェクトを取得します。
TimesTenで唯一サポートされる特殊列は、ROWID疑似列なので、TTCatalogSpecialColumn
オブジェクトにはROWIDの情報しか含めることができません。
TTCatalogSpecialColumnリファレンスも参照してください。
XLAクラスの使用方法
この項では、TTClassesのXLAクラスについて概要を示し、それぞれの使用方法を説明します。
XLAクラスについて
TTClassesは、TimesTen ClassicでサポートされているTimesTenのトランザクション・ログAPI(XLA)で使用する、アプリケーション用の一連のクラスを備えています。
XLAはコール可能なC関数のセットであり、アプリケーションはこれで1つ以上のデータベース表の変更を監視できます。監視対象の表が別のアプリケーションによって変更されるたびに、XLAを使用しているアプリケーションにその変更が通知されます。XLAの詳細は、Oracle TimesTen In-Memory Database C開発者ガイドのXLAおよびTimesTenのイベント管理を参照してください。
XLAクラスでは、TimesTenでサポートされている列の最大数と同じ数のXLA列をサポートしています。詳細は、Oracle TimesTen In-Memory Databaseリファレンスのシステム制限を参照してください。
ノート:
ODBCドライバ・マネージャ使用時の考慮事項(Windows)に示したように、汎用ODBCドライバ・マネージャを使用するときには、TTClassesではXLA機能がサポートされません。
TTXlaPersistConnectionの使用方法
データベースへのXLA接続を作成するには、TTXlaPersistConnection
を使用します。
XLAアプリケーションでは、必要に応じて複数のTTXlaPersistConnection
オブジェクトを作成できます。各TTXlaPersistConnection
オブジェクトには、接続時に指定する、ackUpdates()
メソッドとdeleteBookmarkAndDisconnect()
メソッドで維持する独自のブックマークと関連付ける必要があります。多くのアプリケーションでは、XLAブックマークは1つまたは2つのみ必要です。
XLA接続の確立後、アプリケーションは、その終了までfetchUpdatesWait()
メソッドを繰り返しコールするループに入ります。このループでは、トランザクション・ログで使用可能なファイル・システム領域が一杯にならないように、できるだけ速くXLAから更新をフェッチする必要があります。
ノート:
-
トランザクション・ログは、指定している場合、TimesTen
LogDir
属性で設定したファイル・システムの場所にあり、LogDir
を指定していない場合はDataStore
属性で設定した場所にあります。Oracle TimesTen In-Memory Databaseリファレンスのデータ・ストア属性を参照してください。 -
各ブックマークは、トランザクション・ログに独自のログの保持を確立します。(Oracle TimesTen In-Memory DatabaseリファレンスのttLogHoldsを参照してください。)定期的に進められないブックマークがある場合、チェックポイント処理ではトランザクション・ログをパージできません。これによって、時間の経過とともにファイル・システムが一杯になる場合があります。
アプリケーションは、更新のバッチを処理した後、それらの更新を確認するためにackUpdates()
をコールし、次のfetchUpdatesWait()
のコールに備えます。更新のバッチは、setBookmarkIndex()
およびgetBookmarkIndex()
メソッドを使用して再生できます。また、XLAアプリケーションがfetchUpdatesWait()
の後(ただしackUpdates()
の前)に切断されると、fetchUpdatesWait()
をコールする次の接続(同じブックマーク名を使用)は、同じ更新のバッチを参照します。
データベースからTTXlaPersistConnection
オブジェクトを切断している間に発生する更新は、失われません。これらは、別のTTXlaPersistConnection
オブジェクトが同じブックマーク名で接続されるまでトランザクション・ログに格納されます。
データベースに接続する権限は、CREATE SESSION
権限を使用して、直接またはPUBLIC
ロールを介してユーザーに付与する必要があります。接続メソッドを参照してください。これに加え、XLA接続と機能にはXLA
権限が必要です。
TTXlaPersistConnectionリファレンスも参照してください。
TTXlaRowViewerの使用方法
変更通知レコードからの行イメージを表すTTXlaRowViewer
を使用すると、XLA変更通知レコードの構造と新旧の列値を検証できます。
このクラスのメソッドは、変更通知レコード内の行イメージから列値を検証するために使用できます。TTXlaTable
クラスの関連情報(TTXlaTableの使用方法)も参照してください。
行を検証する前に、TTXlaRowViewer
オブジェクトはTTXlaTableHandler::HandleInsert()
、HandleUpdate()
またはHandleDelete()
メソッド、またはユーザー記述のオーバーロード・メソッド内で起動されるsetTuple()
メソッドを使用する行と関連付ける必要があります。isNull()
メソッドを使用すると、列にnull値があるかを確認できます。nullではない列値は適切なオーバーロードされるGet()
メソッドを使用して検査できます。
TTXlaRowViewerリファレンスも参照してください。
TTXlaTableHandlerの使用方法
TTXlaTableHandler
クラスは、表の変更追跡を有効および無効にするメソッドを提供します。また、XLAからの更新通知レコードを処理するメソッドも提供します。
TTXlaTableHandler
は、アプリケーション開発者が特定の表の変更を処理するためにカスタマイズしたクラスを記述する際の基本クラスです。
コンストラクタは、TTXlaTableHandler
オブジェクトを特定の表に関連付け、TTXlaTableHandler
オブジェクトに含まれるTTXlaTable
データ・メンバーを初期化します。
TTXlaTableHandler(TTXlaPersistConnection& conn, const char* ownerP,
const char* nameP)
TTXlaTableの使用方法も参照してください。
アプリケーション開発者は、TTXlaTableHandler
から1つ以上のクラスを導出し、そのクラスのHandleInsert()
、HandleDelete()
およびHandleUpdate()
メソッドに、アプリケーションのロジックの大部分を配置できます。
表ごとにTTXlaTableHandler
から複数のクラスを導出する設計を行うことも可能です。たとえば、顧客データの変更を処理するビジネス・ロジックなどをCustomerTableHandler
クラスに実装し、注文データの変更を処理するビジネス・ロジックをOrderTableHandler
クラスに実装します。
もう1つの可能な設計は、様々な使用例を処理する1つ以上の汎用クラスをTTXlaTableHandler
から導出することです。たとえば、TTXlaTableHandler
から導出した汎用クラスを使用して、公開/サブスクライブ・システムを介して変更をパブリッシュできます。
TTXlaTableHandler
の拡張クラスの例は、TimesTen Classicのクイック・スタートのxlasubscriber1
とxlasubscriber2
のデモを参照してください。(TimesTenクイック・スタートおよびサンプル・アプリケーションについてを参照してください。)
TTXlaTableHandlerリファレンスも参照してください。
TTXlaTableListの使用方法
TTXlaTableList
クラスには、一連のTTXlaTableHandler
オブジェクトがあり、更新通知イベントを適切なTTXlaTableHandler
にディスパッチするために使用されます。
TTXlaTableHandler
オブジェクトをTTXlaTableHandler
オブジェクトに登録すると、XLAから更新通知レコードをフェッチし、適切なメソッドにディスパッチして処理するプロセスをループによって実行できます。
XLAからの更新通知を受信すると、そのレコードを処理するための適切なTTXlaTableHandler
オブジェクトの適切なHandle
Xxx
()
メソッドがコールされます。
たとえば、CustomerTableHandler
型のオブジェクトが表CUSTOMER
の変更を処理し、OrderTableHandler
型のオブジェクトが表ORDERS
の変更を処理する場合、アプリケーションでは両方のオブジェクトをTTXlaTableList
オブジェクト内に持つ必要があります。XLA更新通知レコードがXLAからフェッチされたとき、TTXlaTableList::HandleChange()
をコールすることによって、それらのレコードを適切なハンドラにディスパッチできます。
コンストラクタには2種類の形式があります。
TTXlaTableList(TTXlaPersistConnection* cP, unsigned int num_tbls_to_monitor)
num_tbls_to_monitor
は、監視するデータベース・オブジェクトの数です。
または
TTXlaTableList(TTXlaPersistConnection* cP);
cP
は、XLA操作に使用するデータベース接続を表します。この形式のコンストラクタでは、最大150のデータベース・オブジェクトを監視できます。
TTXlaTableListリファレンスも参照してください。
TTXlaTableの使用方法
TTXlaTable
クラスは、変更の監視対象の表のメタデータをカプセル化します。
TTXlaTable
は、TimesTen ttXlaTblDesc_t
Cデータ構造のメタデータ・インタフェースとして動作します。(Oracle TimesTen In-Memory Database C開発者ガイドのttXlaTblDesc_tを参照してください。)
ユーザー・アプリケーションでTTXlaTableHandler
を拡張するクラスが作成される場合、通常、列名をそのXLA列番号とマップするためにTTXlaTable::getColNumber()
がコールされます。この列番号は、その後TTXlaRowViewer::Get()
メソッドへの入力に使用できます。これは、TimesTen Classicのクイック・スタートのxlasubscriber2
のデモで示されています。(TimesTenクイック・スタートおよびサンプル・アプリケーションについてを参照してください。)
このクラスには、表の名前、所有者、列数を返す便利なメタデータ関数もあります。
TTXlaTableリファレンスも参照してください。
TTXlaColumnの使用方法
TTXlaColumn
オブジェクトには、変更の監視対象の表の単一行のメタデータが含まれます。
TTXlaColumn
は、TimesTen ttXlaColDesc_t
Cデータ構造のメタデータ・インタフェースとして動作します。(Oracle TimesTen In-Memory Database C開発者ガイドのttXlaColDesc_tを参照してください。)列名、型、精度、スケールを含む情報を取得できます。
アプリケーションで、TTXlaRowViewer::
getColumn()メソッドを使用し、列とTTXlaColumn
オブジェクトを関連付けます。
TTXlaColumnリファレンスも参照してください。