JDBC ドライバーの準備されたステートメント メタデータ キャッシュ

JDBC ドライバーのダウンロード

この記事では、ドライバーのパフォーマンスを向上させるために実装された 2 つの変更について説明します。

準備されたステートメントに対する準備解除のバッチ処理

バージョン 6.1.6 プレビュー以降、SQL Server へのサーバーのラウンド トリップを最小限に抑えることでパフォーマンスの改善が実装されました。 以前は、すべての prepareStatement クエリに対して、準備解除の呼び出しも送信されていました。 6.1.6 プレビュー以降、ドライバーは、しきい値 "ServerPreparedStatementDiscardThreshold" (既定値は 10) まで準備解除クエリをバッチ処理するようになりました。

注意

ユーザーは、setServerPreparedStatementDiscardThreshold(整数値) メソッドを使用して、この既定値を変更できます。

6\.1.6 プレビューから導入された変更がもう 1 つあります。このバージョンの前までは、ドライバーで常に sp_prepexec が呼び出されていました。 現在は、準備されたステートメントの最初の実行ではドライバーによって sp_executesql が呼び出され、それより後では sp_prepexec が実行されてハンドルが割り当てられるようになりました。 詳細については、こちらをご覧ください。

11.2 リリース以降では、最初の sp_executesql 呼び出しの後、ドライバーは prepareMethod 接続文字列プロパティで指定された値に応じて、追加の呼び出しで sp_prepare または sp_prepexec のいずれかを実行できます。 詳細については、「接続プロパティの設定」を参照してください。

注意

ユーザーは、setEnablePrepareOnFirstPreparedStatementCall(boolean value) メソッドを使用して enablePrepareOnFirstPreparedStatementCall を true に設定することにより、既定の動作を、以前のバージョンの常に sp_prepexec が呼び出される動作に変更することができます。

準備されたステートメントに対する準備解除をバッチ処理するためのこの変更で新しく導入された API の一覧

SQLServerConnection

新しいメソッド 説明
int getDiscardedServerPreparedStatementCount() 現在未処理の準備解除アクションの数が返されます。
void closeUnreferencedPreparedStatementHandles() 破棄された未処理の準備されたステートメントに対する準備解除要求を強制的に実行します。
boolean getEnablePrepareOnFirstPreparedStatementCall() 特定の接続インスタンスの動作を返します。 false の場合、最初の実行では sp_executesql が呼び出され、ステートメントは準備されません。 2 回目の実行が発生した場合は、sp_prepare または sp_prepexec が呼び出されて、準備されたステートメントのハンドルが実際に設定されます。 後続の実行では、sp_execute が呼び出されます。 この動作により、ステートメントの実行が 1 回のみの場合、準備されたステートメントを閉じるときに sp_unprepare を行う必要はなくなります。 このオプションの既定値は、setDefaultEnablePrepareOnFirstPreparedStatementCall() を呼び出して変更することができます。
void setEnablePrepareOnFirstPreparedStatementCall(boolean value) 特定の接続インスタンスの動作を指定します。 値が false の場合、最初の実行では sp_executesql が呼び出され、ステートメントは準備されません。 2 回目の実行が発生した場合は、sp_prepare または sp_prepexec が呼び出されて、準備されたステートメントのハンドルが実際に設定されます。 後続の実行では、sp_execute が呼び出されます。 この動作により、ステートメントの実行が 1 回のみの場合、準備されたステートメントを閉じるときに sp_unprepare を行う必要はなくなります。
int getServerPreparedStatementDiscardThreshold() 特定の接続インスタンスの動作を返します。 この設定により、サーバーで未処理のハンドルをクリーンアップする呼び出しが実行される前に、1 つの接続に存在できる未処理の破棄アクション (sp_unprepare) の数を制御できます。 設定が 1 以下の場合、準備解除アクションは、準備されたステートメントの終了時に直ちに実行されます。 これを {@literal >} 1 に設定した場合、これらの呼び出しは、sp_unprepare を頻繁に呼び出すことによるオーバーヘッドを回避するために、まとめてバッチ処理されます。 このオプションの既定値は、getDefaultServerPreparedStatementDiscardThreshold() を呼び出して変更することができます。
void setServerPreparedStatementDiscardThreshold(int value) 特定の接続インスタンスの動作を指定します。 この設定により、サーバーで未処理のハンドルをクリーンアップする呼び出しが実行される前に、1 つの接続に存在できる未処理の破棄アクション (sp_unprepare) の数を制御できます。 設定が 1 以下の場合、準備解除アクションは、準備されたステートメントの終了時に直ちに実行されます。 1 より大きい値に設定すると、これらの呼び出しは、sp_unprepare を頻繁に呼び出すことによるオーバーヘッドを回避するために、まとめてバッチ処理されます。

SQLServerDataSource

新しいメソッド 説明
void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) この構成が false の場合、準備されたステートメントの最初の実行では sp_executesql が呼び出され、ステートメントは準備されません。 2 回目の実行が発生した場合は、sp_prepare または sp_prepexec が呼び出されて、準備されたステートメントのハンドルが実際に設定されます。 後続の実行では、sp_execute が呼び出されます。 この動作により、ステートメントの実行が 1 回のみの場合、準備されたステートメントを閉じるときに sp_unprepare を行う必要はなくなります。
boolean getEnablePrepareOnFirstPreparedStatementCall() この構成から false が返される場合、準備されたステートメントの最初の実行では sp_executesql が呼び出され、ステートメントは準備されません。 2 回目の実行が発生した場合は、sp_prepare または sp_prepexec が呼び出されて、準備されたステートメントのハンドルが実際に設定されます。 後続の実行では、sp_execute が呼び出されます。 この動作により、ステートメントの実行が 1 回のみの場合、準備されたステートメントを閉じるときに sp_unprepare を行う必要はなくなります。
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) この設定により、サーバーで未処理のハンドルをクリーンアップする呼び出しが実行される前に、1 つの接続に存在できる未処理の破棄アクション (sp_unprepare) の数を制御できます。 設定が 1 以下の場合、準備解除アクションは、準備されたステートメントの終了時に直ちに実行されます。 これを {@literal >} 1 に設定した場合、これらの呼び出しは、sp_unprepare を頻繁に呼び出すことによるオーバーヘッドを回避するために、まとめてバッチ処理されます
int getServerPreparedStatementDiscardThreshold() この設定により、サーバーで未処理のハンドルをクリーンアップする呼び出しが実行される前に、1 つの接続に存在できる未処理の破棄アクション (sp_unprepare) の数を制御できます。 設定が 1 以下の場合、準備解除アクションは、準備されたステートメントの終了時に直ちに実行されます。 これを {@literal >} 1 に設定した場合、これらの呼び出しは、sp_unprepare を頻繁に呼び出すことによるオーバーヘッドを回避するために、まとめてバッチ処理されます。

準備されたステートメントのメタデータ キャッシュ

バージョン 6.3.0-preview 以降、Microsoft JDBC driver for SQL Server では、準備されたステートメントのキャッシュがサポートされます。 v6.3.0-preview より前は、既に準備され、キャッシュに格納されたクエリを実行すると、同じクエリを再度呼び出しても、準備は行われませんでした。 現在は、ドライバーによってキャッシュ内のクエリが検索され、見つかったハンドルを使用して、sp_execute が実行されるようになりました。 準備されたステートメント メタデータのキャッシュは、既定では無効に設定されます。 これを有効にするには、接続オブジェクトで次のメソッドを呼び出す必要があります。

setStatementPoolingCacheSize(int value) //value is the desired cache size (any value bigger than 0) setDisableStatementPooling(boolean value) //false allows the caching to take place

たとえば、connection.setStatementPoolingCacheSize(10)connection.setDisableStatementPooling(false) のようにします。

準備されたステートメント メタデータをキャッシュするためのこの変更で新しく導入された API の一覧

SQLServerConnection

新しいメソッド 説明
void setDisableStatementPooling(boolean value) ステートメント プーリングが true または false に設定されます。
boolean getDisableStatementPooling() ステートメント プーリングが無効の場合、true を返します。
void setStatementPoolingCacheSize(int value) この接続の準備されたステートメント キャッシュのサイズを指定します。 1 未満の値は、キャッシュしないことを意味します。
int getStatementPoolingCacheSize() この接続のために準備されたステートメント キャッシュのサイズが返されます。 1 未満の値は、キャッシュしないことを意味します。
int getStatementHandleCacheEntryCount() プール済みの準備されたステートメントの現在のハンドル数が返されます。
boolean isPreparedStatementCachingEnabled() この接続に対してステートメント プーリングが有効であるかどうかを返します。

SQLServerDataSource

新しいメソッド 説明
void setDisableStatementPooling(boolean disableStatementPooling) ステートメント プーリングを true または false に設定します。
boolean getDisableStatementPooling() ステートメント プーリングが無効の場合、true を返します。
void setStatementPoolingCacheSize(int statementPoolingCacheSize) この接続の準備されたステートメント キャッシュのサイズを指定します。 1 未満の値は、キャッシュしないことを意味します。
int getStatementPoolingCacheSize() この接続のために準備されたステートメント キャッシュのサイズが返されます。 1 未満の値は、キャッシュしないことを意味します。

関連項目

JDBC ドライバーによるパフォーマンスと信頼性の強化