JDBC 驅動程式的備妥陳述式中繼資料快取

下載 JDBC 驅動程式

此文章提供這兩個變更的相關資訊,實作之後可強化驅動程式的效能。

備妥陳述式的未準備批次處理

從 6.1.6-preview 版開始,效能的改善已透過將伺服器來回行程降至 SQL Server 來實作。 先前,針對每個 prepareStatement 查詢,也會傳送對 unprepare 的呼叫。 現在,驅動程式會批次處理 unprepare 查詢,最高可達閾值 "ServerPreparedStatementDiscardThreshold",其預設值為 10。

注意

使用者可以使用下列方法變更預設值:setServerPreparedStatementDiscardThreshold(int value)

從 6.1.6-preview 導入的另一項變更是,在此版本之前,驅動程式一律會呼叫 sp_prepexec。 現在,在第一次執行備妥的陳述式時,驅動程式會呼叫 sp_executesql,而在之後則會執行 sp_prepexec 並為其指派控制代碼。 在 這裡可以找到更多詳細資訊。

從 11.2 版開始,在初始 sp_executesql 呼叫之後,驅動程式可以根據 prepareMethod 連接字串屬性中指定的值,執行 sp_preparesp_prepexec 進行其他呼叫。 如需詳細資訊,請參閱設定連線屬性

注意

使用者可以使用下列方法,將 enablePrepareOnFirstPreparedStatementCall 設定為 true,以便將預設行為變更為舊版的一律呼叫 sp_prepexec:setEnablePrepareOnFirstPreparedStatementCall(boolean value)

與這項變更一起引入之新 API 的清單,適用於備妥陳述式的未準備批次處理

SQLServerConnection

新的方法 描述
int getDiscardedServerPreparedStatementCount() 傳回目前未完成未準備動作的數目。
void closeUnreferencedPreparedStatementHandles() 強制執行任何未完成捨棄備妥陳述式的未準備要求。
boolean getEnablePrepareOnFirstPreparedStatementCall() 傳回特定連線執行個體的行為。 如果為 false,則第一次執行會呼叫 sp_executesql,而且不會準備陳述式。 如果發生第二次執行,便會呼叫 sp_preparesp_prepexec,實際上會設定已備妥的陳述式控制代碼。 稍後的執行會呼叫 sp_execute。 如果該陳述式僅執行一次,則此行為無需在備妥陳述式結束時使用 sp_unprepare。 您可以藉由呼叫 setDefaultEnablePrepareOnFirstPreparedStatementCall() 來變更這個選項的預設值。
void setEnablePrepareOnFirstPreparedStatementCall(boolean value) 指定特定連線執行個體的行為。 如果值為 false,則第一次執行會呼叫 sp_executesql,而且不會準備陳述式。 如果發生第二次執行,便會呼叫 sp_preparesp_prepexec,實際上會設定已備妥的陳述式控制代碼。 稍後的執行會呼叫 sp_execute。 如果該陳述式僅執行一次,則此行為無需在備妥陳述式結束時使用 sp_unprepare
int getServerPreparedStatementDiscardThreshold() 傳回特定連線執行個體的行為。 此設定可控制在執行清理伺服器上未完成控制代碼的呼叫之前,每個連線可以有多少個未完成的捨棄動作 (sp_unprepare)。 如果設定為 <= 1,就會在備妥陳述式一結束時,立即執行取消準備動作。 如果將其設定為 {@literal >} 1,則會將這些呼叫一併進行批次處理,以避免太常呼叫 sp_unprepare 所造成的額外負荷。 您可以藉由呼叫 getDefaultServerPreparedStatementDiscardThreshold() 來變更這個選項的預設值。
void setServerPreparedStatementDiscardThreshold(int value) 指定特定連線執行個體的行為。 此設定可控制在執行清理伺服器上未完成控制代碼的呼叫之前,每個連線可以有多少個未完成的捨棄動作 (sp_unprepare)。 如果設定為 <= 1,就會在備妥陳述式一結束時,立即執行取消準備動作。 如果將其設定為 > 1,則會將這些呼叫一併進行批次處理,以避免太常呼叫 sp_unprepare 所造成的額外負荷。

SQLServerDataSource

新的方法 描述
void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) 如果此設定為 false,則已備妥陳述式的第一次執行會呼叫 sp_executesql,而且不會備妥陳述式。 如果發生第二次執行,便會呼叫 sp_preparesp_prepexec,實際上會設定已備妥的陳述式控制代碼。 稍後的執行會呼叫 sp_execute。 如果該陳述式僅執行一次,則此行為無需在備妥陳述式結束時使用 sp_unprepare
boolean getEnablePrepareOnFirstPreparedStatementCall() 如果此設定傳回 false,則已備妥陳述式的第一次執行會呼叫 sp_executesql,而且不會備妥陳述式。 如果發生第二次執行,便會呼叫 sp_preparesp_prepexec,實際上會設定已備妥的陳述式控制代碼。 稍後的執行會呼叫 sp_execute。 如果該陳述式僅執行一次,則此行為無需在備妥陳述式結束時使用 sp_unprepare
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) 此設定可控制在執行清理伺服器上未完成控制代碼的呼叫之前,每個連線可以有多少個未完成的捨棄動作 (sp_unprepare)。 如果設定為 <= 1,就會在備妥陳述式一結束時,立即執行取消準備動作。 如果將其設定為 {@literal >} 1,則會將這些呼叫一併進行批次處理,以避免太常呼叫 sp_unprepare 所造成的額外負荷
int getServerPreparedStatementDiscardThreshold() 此設定可控制在執行清理伺服器上未完成控制代碼的呼叫之前,每個連線可以有多少個未完成的捨棄動作 (sp_unprepare)。 如果設定為 <= 1,就會在備妥陳述式一結束時,立即執行取消準備動作。 如果將其設定為 {@literal >} 1,則會將這些呼叫一併進行批次處理,以避免太常呼叫 sp_unprepare 所造成的額外負荷。

已備妥的陳述式中繼資料快取

從 6.3.0-preview 版開始,適用於 SQL Server 的 Microsoft JDBC 驅動程式支援備妥陳述式快取。 在 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 驅動程式的效能與可靠性