プログラミングに関するベスト・プラクティス

このページでは、Oracle TimesTen製品を使用して最適なパフォーマンスを実現するためのコーディング方法について、上位5つの推奨事項を示します。

プログラミング
-
ミリ秒数: 直接リンクされる接続を使用して、レスポンス時間を最短にする
-
事前に問合せを準備し、列とパラメータをバインドする
-
アプリケーションの接続をチューニングし、接続プーリングを使用する
-
カーソルを即時にクローズする
-
自動コミットと定期的なコミットを無効化する
 

ミリ秒数: 直接リンクされる接続を使用して、レスポンス時間を最短にする

アプリケーションがTimesTenデータベースにアクセスする方法を制御可能で、TimesTenデータベースと同じマシンでアプリケーションを実行できる場合は、直接リンク接続モードを使用することをお薦めします。直接リンクされるアプリケーションでは、データベース操作がアプリケーション・プロセスのアドレス空間から直接実行されるため、プロセス間通信およびネットワーク・ラウンドトリップによるオーバーヘッドが生じることなく、クライアント/サーバー・アプリケーションよりも非常に優れたパフォーマンスを実現できます。

TimesTenは、マルチプロセスおよびマルチスレッド・アプリケーションをサポートします。TimesTenデータベースは、直接リンク接続モードを使用するプロセスとクライアント/サーバー接続モードを使用するプロセスで共有することができます。

JDBCインタフェースを利用するJavaアプリケーションでは、直接リンク接続モードを簡単に使用できます。JDBC接続文字列をjdbc:TimesTen:direct:…の形式に変更するだけで使用できます。

Oracle Databaseからキャッシュされるデータにアクセスするアプリケーションでは、直接リンク接続を使用すると、Oracle DatabaseからキャッシュされないTimesTenデータの場合と同様にアプリケーションのパフォーマンスが向上します。

直接リンク接続をアプリケーションで使用できない場合でも、クライアント/サーバー接続を使用すると、従来のディスクベースのリレーショナル・データベースにアクセスする場合よりも大幅にパフォーマンスが向上します。これは、主に、TimesTen製品がメモリー内でのデータ構造とレイアウト用に設計および最適化されているためです。

事前にすべてのSQL問合せを準備し、列/パラメータをバインドする

最適なパフォーマンスを得るには、複数回実行するすべてのSQL文を事前に準備しておく必要があります。これはすべてのリレーショナル・データベースにあてはまります。ただし、TimesTenをきわめて高速なトランザクション率で使用する場合、文のコンパイルに必要な時間が、文の実行に必要な時間の数倍に達する可能性もあります。

文の事前準備に加えて、それらのSQL文の入力パラメータと出力列も事前にバインドしておく必要があります。

-
ODBCのユーザーは、SQLPrepare関数を使用します。
-
TTClassesのユーザーは、TTCmd:Prepareメソッドを使用します。
-
JDBCのユーザーは、PreparedStatementクラスを使用します。
-
OCIのユーザーは、OCIStmtPrepare関数を使用します。

接続のチューニングおよび接続プーリングの使用

アプリケーションがマルチスレッドで、同じTimesTenデータベースへの接続を複数オープンしている場合は、接続に注意を払い、慎重に管理する必要があります。インメモリー・データベースとして、TimesTenでは使用可能なプロセッサ・リソースが有効に利用されるため、一般的にCPUは限界に達します。ディスク・ベースのRDBMSを実行している多くのアプリケーションでディスクが限界に達すると予想されるのと同様です。マシン上の操作を処理するためのCPUよりも多くの同時接続が同時にアクティブである場合、最適なパフォーマンスを実現するのは困難であり、不必要な同時接続があるとアプリケーションのスループットが低下する可能性もあります。

アプリケーションに多くの接続が必要な場合は、接続がトランザクションに対して効率的に保持されるようにする必要があります。接続プールを使用して接続を効率的に使用する方が、多数のアイドル状態の接続を保持するよりも効果的です。TTClassesおよびJDBCを使用した接続プーリングの例は、クイック・スタートの下の/developer/connection_poolsディレクトリを参照してください。また、市販のJ2EEアプリケーション・サーバーでは、通常、デフォルトで接続プーリングが使用されます。

カーソルを即時にクローズする

Oracle Databaseと同様に、TimesTen読取り専用トランザクションをコミットする必要はありません。ただし、読取り専用のカーソルを即時にクローズして、読取り専用のSQL問合せで保持されていたすべてのリソース(ソート操作で使用された一時領域など)を解放することは重要です。

SQLカーソルをクローズするには、次のメソッドを使用します。

-
ODBCの場合は、SQLFreeStmt(SQL_CLOSE)を使用します。
-
TTClassesの場合は、TTcmd:Closeメソッドを使用します。
-
JDBCの場合は、PreparedStatement.closeメソッドを使用します。
-
OCIの場合は、OCIHandleFree関数を使用します。

自動コミットと定期的なコミットを無効化する

ODBCおよびJDBCでは、デフォルトで、データベースへのすべての接続に対して自動コミットが有効になっています。つまり、各SQL文が、それぞれのトランザクションでコミットされます。自動コミットを無効にし、複数のSQL文を単一のトランザクションで明示的にコミットすることで、アプリケーションのパフォーマンスを大幅に向上させることができます。この方法は、バルク挿入やバルク削除などの大規模な操作の場合に特に有効です。(TTClassesは、デフォルトで自動コミットを無効にします。)

ただし、1つのトランザクションにグループ化する操作を多くしすぎると、各トランザクションのロックの保持時間が非常に長くなり、システムの同時実行性が大幅に低下する可能性もあります。通常、バルク挿入、バルク更新およびバルク削除操作は、数千行ごとにコミットする場合に最も効率的に処理される傾向があります。

アプリケーションのチューニングの詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』および『Oracle TimesTen In-Memory Database Java開発者ガイド』を参照してください。