共用方式為


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

下載 JDBC 驅動程式

本文提供兩項提升駕駛表現的改變資訊。

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

從 6.2 版本開始,實作了效能提升,將伺服器往返 SQL Server 的次數降至最低。 先前,針對每個 prepareStatement 查詢,也會傳送對 unprepare 的呼叫。 現在,驅動程式批次處理了 unprepare 查詢,直到預設值為 10 的閾值 ServerPreparedStatementDiscardThreshold

注意

使用者可透過以下方法更改預設值: setServerPreparedStatementDiscardThreshold(int value)

在 6.2 版本之前,驅動程式總是呼叫 sp_prepexec。 在 6.2 及之後版本中,對於預備語句的首次執行,驅動程式會呼叫 sp_executesql ,其餘則執行 sp_prepexec 並指派一個句柄。 欲了解更多資訊,請參閱 PreparedStatement 元資料快取功能

從版本 11.2 開始,初始呼叫後sp_executesql,驅動程式可以執行sp_preparesp_prepexec的額外呼叫,這取決於連線字串屬性中指定的prepareMethod值。 如需詳細資訊,請參閱設定連線屬性

注意

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

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

SQLServerConnection 解除批次準備

新的方法 描述
int getDiscardedServerPreparedStatementCount() 傳回目前未完成未準備動作的數目。
void closeUnreferencedPreparedStatementHandles() 強制執行任何未完成捨棄備妥陳述式的未準備要求。
布林值 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,就會在備妥陳述式一結束時,立即執行取消準備動作。 當設定為 > 1 時,這些呼叫會批次同時處理,以避免過於頻繁呼叫 sp_unprepare 所造成的開銷。 您可以藉由呼叫 getDefaultServerPreparedStatementDiscardThreshold() 來變更這個選項的預設值。
void setServerPreparedStatementDiscardThreshold(整數值) 指定特定連線執行個體的行為。 此設定可控制在執行清理伺服器上未完成控制代碼的呼叫之前,每個連線可以有多少個未完成的捨棄動作 (sp_unprepare)。 如果設定為 <= 1,就會在備妥陳述式一結束時,立即執行取消準備動作。 當設為 > 1 時,這些呼叫會被合併,從而減少呼叫 sp_unprepare 過於頻繁所產生的開銷。

SQLServerDataSource 解除準備批次操作

新的方法 描述
void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) 如果此設定為 false,則已備妥陳述式的第一次執行會呼叫 sp_executesql,而且不會備妥陳述式。 若發生第二次執行,則呼叫 sp_preparesp_prepexec 並設定一個已準備好的語句句柄。 稍後的執行會呼叫 sp_execute。 此行為消除了在預備語句結束時需要 sp_unprepare 的需求,僅當陳述句只執行一次時。
布林值 getEnablePrepareOnFirstPreparedStatementCall() 如果此設定傳回 false,則已備妥陳述式的第一次執行會呼叫 sp_executesql,而且不會備妥陳述式。 如果發生第二次執行,便會呼叫 sp_preparesp_prepexec,實際上會設定已備妥的陳述式控制代碼。 稍後的執行會呼叫 sp_execute。 此行為使得如果陳述句僅被執行一次,就不需要在結束預備語句時使用sp_unprepare
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) 此設定可控制在執行清理伺服器上未完成控制代碼的呼叫之前,每個連線可以有多少個未完成的捨棄動作 (sp_unprepare)。 如果設定為 <= 1,就會在備妥陳述式一結束時,立即執行取消準備動作。 當設為> 1 時,這些呼叫會進行批次處理,以避免頻繁呼叫 sp_unprepare 的開銷。
int getServerPreparedStatementDiscardThreshold() 此設定可控制在執行清理伺服器上未完成控制代碼的呼叫之前,每個連線可以有多少個未完成的捨棄動作 (sp_unprepare)。 如果設定為 <= 1,就會在備妥陳述式一結束時,立即執行取消準備動作。 這些呼叫設定為 > 1 時,會進行批次處理,以避免過於頻繁地呼叫 sp_unprepare 所產生的額外開銷。

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

從 6.4 版本開始,Microsoft JDBC 的 SQL Server 驅動程式支援預先準備的語句快取。 在 6.4 版本之前,如果執行的查詢已經準備好並儲存在快取中,再次呼叫同一查詢不需要再準備一次。 驅動程式會從快取中查詢該查詢以找到句柄,並以 執行。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。
布林型 getDisableStatementPooling() 如果陳述式共用遭到停用,則傳回 true。
void setStatementPoolingCacheSize(整數值) 指定此連線之備妥陳述式快取的大小。 值 < 1 表示沒有快取。
整數 getStatementPoolingCacheSize() 傳回此連線備妥陳述式快取的大小。 值 < 1 表示沒有快取。
int getStatementHandleCacheEntryCount() 傳回目前共用備妥陳述式控制代碼的數目。
布林值方法 isPreparedStatementCachingEnabled() 無論陳述式共用是否已針對此連線啟用。

SQLServerDataSource 中繼資料快取

新的方法 描述
void setDisableStatementPooling(布林值 disableStatementPooling) 將陳述式共用設定為 true 或 false
布林型 getDisableStatementPooling() 如果陳述式共用遭到停用,則傳回 true。
void setStatementPoolingCacheSize(int 語句集緩存大小) 指定此連線之備妥陳述式快取的大小。 值 < 1 表示沒有快取。
整數 getStatementPoolingCacheSize() 傳回此連線備妥陳述式快取的大小。 值 < 1 表示沒有快取。

另請參閱

提升 JDBC 驅動程式的效能與可靠性預備的參數效能