TimesTen Clientを使用してリモート・サーバー・マシンにあるデータ・ストアにアクセスする場合、接続に対してネットワーク上のオーバーヘッドが発生することがあります。可能であれば、TimesTen Data Managerをローカルにアクセスするようにアプリケーションを作成し、アプリケーションをTimesTen Data Managerと直接リンクするようにしてください。
TimesTen Clientは、通常、TCP/IPソケットを使用してTimesTen Serverと通信します。TimesTen ClientとTimesTen Serverの両方が同一マシン上にある場合は、プロセス間の通信(IPC)に共有メモリー・セグメントまたはUNIXドメイン・ソケットを使用することで、クライアント・アプリケーションのパフォーマンスが改善されます。
共有メモリー・セグメントをIPCとして使用するには、ttendaemon.optionsファイルでサーバー・オプションを設定する必要があります。サーバー・オプションの詳細は、「TimesTen Webサーバーのオプションの変更」を参照してください。
また、IPCに共有メモリー・セグメントを使用するアプリケーションでは、ネットワーク・アドレスとしてttShmHostを使用して論理サーバー名(クライアントDSNに対する)を設定する必要があります。詳細は、「UNIXでのクライアントDSNの作成および構成」を参照してください。
この機能は共有メモリーを大量に必要とする可能性があります。TimesTen Serverは、既存の接続数や全接続内の文の数にかかわりなく、共有メモリー・セグメントを事前に割り当てます。
UNIXマシンでアプリケーションを実行しているときにメモリーの使用量が懸念される場合は、UNIXドメイン・ソケットを通信に使用すると、TimesTen Client ODBCドライバを使用しているアプリケーションのパフォーマンスを改善できる場合があります。UNIXドメイン・ソケットの使用によるパフォーマンスの改善は、ShmIPCを使用した場合ほど大きくありません。
ローカル接続にUNIXドメイン・ソケットを使用するアプリケーションでは、ネットワーク・アドレスとしてttLocalHostを使用して論理サーバー名(クライアントDSNに対する)を設定する必要があります。詳細は、「UNIXでのクライアントDSNの作成および構成」を参照してください。また、システム・カーネル・パラメータが、必要な接続数を許容するように設定されていることも確認してください。『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のインストールの前提条件に関する項を参照してください。
TimesTen接続オプションのTT_PREFETCH_CLOSEを使用すると、TimesTen Clientドライバを使用するアプリケーションで、特定のSELECT問合せのパフォーマンスが改善されます。これはODBC文のオプションで、SQLSetStatementOptionによって設定できます。このオプションを使用するには、アプリケーションで明示的に「ON」または「OFF」を指定する必要があります。このオプションは、カーソルをクローズしたりコミットするためのネットワークI/Oを不要にするために設けられています。
TimesTen Serverは、SQLExecuteおよびSQLExecDirectの実行時に、データ・ストアの結果セットの全部または一部をプリフェッチしており、このデータは、TimesTen Clientでバッファリングされます。これにより、クライアントとサーバー間のネットワークI/Oが低減されます。また、AUTOCOMMITが無効であれば、結果セットの終わりに達するとサーバーはカーソルも閉じます。
読取り専用のトランザクションでTT_PREFETCH_CLOSEが有効な場合、AUTOCOMMITが無効であれば、サーバーではトランザクションがコミットされます。AUTOCOMMITが有効であれば、カーソルが閉じられ、サーバーではトランザクションがコミットされます。
通常、次の条件がすべて満たされている場合には、アプリケーションでTT_PREFETCH_CLOSEオプションを有効にしてください。
次の例は、JDBCとODBCでTT_PREFETCH_CLOSEオプションを使用する方法を示しています。
JDBCでTT_PREFETCH_CLOSEオプションを使用するには、次のようにします。
SQLSetConnectOption (hdbc, TT_PREFETCH_CLOSE, TT_PREFETCH_CLOSE_ON); SQLExecDirect (hstmt, "SELECT * FROM T", SQL_NTS); while (SQLFetch (hstmt) != SQL_NO_DATA_FOUND) { // do the processing } SQLFreeStmt (hstmt, SQL_CLOSE); SQLTransact (henv, hdbc, SQL_COMMIT); SQLSetConnectOption (hdbc, TT_PREFETCH_CLOSE, TT_PREFETCH_CLOSE_OFF);
ODBCでTT_PREFETCH_CLOSEオプションを使用するには、次のようにします。
con = DriverManager.getConnection ("jdbc:timesten:client:" + DSN); stmt = con.createStatement(); import com.timesten.sql ........... ........... con.setTtPrefetchClose(boolean); rs = stmt.executeQuery("select * from t"); while(rs.next()) { // do the processing } import com.timesten.sql .... try { ((TimesTenConnection)con).setTtPrefetchClose(true); } catch (SQLException) { ... } rs.close(); con.commit(); con.setTtPreFetchClose (false);
アプリケーションは、SQL_NULL_HDBCおよび有効な環境ハンドルを使用してSQLTransactをコールできます。
SQLTransact (ValidHENV, SQL_NULL_HDBC, fType)または、有効な接続ハンドルを使用してコールすることもできます。
SQLTransact (SQL_NULL_HENV, ValidHDBC, fType).有効な環境ハンドルを使用する場合、TimesTenドライバでは、接続されているすべての接続ハンドルでトランザクションのコミット/ロールバックが試行されます。クライアント/サーバー・モードでは、これによってn個以上のネットワークI/O操作が発生します。ここで、nとは接続されている接続ハンドルの数です。通常、ネットワークI/O操作は、TimesTenデータベース操作より高コストになります。
したがって、アプリケーションでは、単一接続でコミット/ロールバックするのみの場合、SQLTransactのコール時に有効な接続ハンドルを使用する必要があります。