本文提供兩項提升駕駛表現的改變資訊。
備妥陳述式的未準備批次處理
從 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_prepare或sp_prepexec的額外呼叫,這取決於連線字串屬性中指定的prepareMethod值。 如需詳細資訊,請參閱設定連線屬性。
注意
使用者可以使用下列方法,將 enablePrepareOnFirstPreparedStatementCall 設定為 sp_prepexec,以便將預設行為變更為舊版的一律呼叫 :setEnablePrepareOnFirstPreparedStatementCall(boolean value)
與這項變更一起引入之新 API 的清單,適用於備妥陳述式的未準備批次處理
SQLServerConnection 解除批次準備
| 新的方法 | 描述 |
|---|---|
| int getDiscardedServerPreparedStatementCount() | 傳回目前未完成未準備動作的數目。 |
| void closeUnreferencedPreparedStatementHandles() | 強制執行任何未完成捨棄備妥陳述式的未準備要求。 |
| 布林值 getEnablePrepareOnFirstPreparedStatementCall() | 傳回特定連線執行個體的行為。 如果為 false,則第一次執行會呼叫 sp_executesql,而且不會準備陳述式。 如果發生第二次執行,便會呼叫 sp_prepare 或 sp_prepexec,實際上會設定已備妥的陳述式控制代碼。 稍後的執行會呼叫 sp_execute。 如果該陳述式僅執行一次,則此行為無需在備妥陳述式結束時使用 sp_unprepare。 您可以藉由呼叫 setDefaultEnablePrepareOnFirstPreparedStatementCall() 來變更這個選項的預設值。 |
| void setEnablePrepareOnFirstPreparedStatementCall(boolean value) | 指定特定連線執行個體的行為。 如果值為 false,則第一次執行會呼叫 sp_executesql,而且不會準備陳述式。 如果發生第二次執行,便會呼叫 sp_prepare 或 sp_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_prepare 或 sp_prepexec 並設定一個已準備好的語句句柄。 稍後的執行會呼叫 sp_execute。 此行為消除了在預備語句結束時需要 sp_unprepare 的需求,僅當陳述句只執行一次時。 |
| 布林值 getEnablePrepareOnFirstPreparedStatementCall() | 如果此設定傳回 false,則已備妥陳述式的第一次執行會呼叫 sp_executesql,而且不會備妥陳述式。 如果發生第二次執行,便會呼叫 sp_prepare 或 sp_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 表示沒有快取。 |