Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporciona información sobre dos cambios que mejoran el rendimiento del controlador.
Procesamiento por lotes de la cancelación de preparación para instrucciones preparadas
A partir de la versión 6.2, se implementa una mejora en el rendimiento que minimiza los recorridos de ida y vuelta del servidor a SQL Server. Anteriormente, por cada consulta `prepareStatement`, también se enviaba una llamada a `unprepare`. Ahora, el controlador agrupa en lotes las consultas sin preparar hasta el umbral ServerPreparedStatementDiscardThreshold, cuyo valor predeterminado es 10.
Nota:
Los usuarios pueden cambiar el valor predeterminado con el método siguiente: setServerPreparedStatementDiscardThreshold(int value)
Antes de la versión 6.2, el controlador siempre llama a sp_prepexec. En la versión 6.2 y posteriores, para la primera ejecución de una instrucción preparada, el controlador llama a sp_executesql y para el resto, ejecuta sp_prepexec y le asigna un identificador. Para obtener más información, consulta Almacenamiento en caché de metadatos de PreparedStatement.
A partir de la versión 11.2, después de la llamada inicial sp_executesql, el controlador puede ejecutar sp_prepare o sp_prepexec para llamadas adicionales, según el valor especificado en la propiedad de cadena de conexión prepareMethod. Para obtener más información, vea Establecimiento de las propiedades de conexión.
Nota:
Los usuarios pueden cambiar el comportamiento predeterminado al comportamiento de las versiones anteriores, de llamar siempre a sp_prepexec, configurando enablePrepareOnFirstPreparedStatementCall con el valor true mediante el siguiente método: setEnablePrepareOnFirstPreparedStatementCall(boolean value)
Lista de las nuevas API presentadas con este cambio, para el procesamiento por lotes de la cancelación de preparación para instrucciones preparadas
SQLServerConnection desprepare el procesamiento por lotes
| Nuevo método | Descripción |
|---|---|
| int getDiscardedServerPreparedStatementCount() | Devuelve el número de acciones de cancelación de preparación de instrucciones preparadas pendientes. |
| void closeUnreferencedPreparedStatementHandles() | Fuerza las solicitudes de cancelación de preparación para cualquier instrucción preparada descartada pendiente que se vaya a ejecutar. |
| boolean getEnablePrepareOnFirstPreparedStatementCall() | Devuelve el comportamiento de una instancia de conexión específica. Si es false, la primera ejecución llama a sp_executesql y no prepara una instrucción. Si se produce una segunda ejecución, llama a sp_prepare o sp_prepexec y configura realmente un identificador de instrucción preparado. Las ejecuciones posteriores invocan sp_execute. Esto alivia la necesidad de usar sp_unprepare en la instrucción preparada Close si la instrucción solo se ejecuta una vez. El valor predeterminado de esta opción se puede cambiar llamando a setDefaultEnablePrepareOnFirstPreparedStatementCall(). |
| void setEnablePrepareOnFirstPreparedStatementCall(valor booleano) | Especifica el comportamiento de una instancia de conexión específica. Si el valor es falso, la primera ejecución llama a sp_executesql y no prepara una sentencia. Si se produce una segunda ejecución, llama a sp_prepare o sp_prepexec y configura realmente un identificador de instrucción preparado. Las ejecuciones posteriores invocan sp_execute. Esto alivia la necesidad de usar sp_unprepare en la instrucción preparada Close si la instrucción solo se ejecuta una vez. |
| int getServerPreparedStatementDiscardThreshold() | Devuelve el comportamiento de una instancia de conexión específica. Esta configuración controla cuántas operaciones de descarte (sp_unprepare) puede haber pendientes en cada conexión antes de que se realice una llamada para limpiar los handles pendientes en el servidor. Si el valor es <= 1, las acciones de cancelación de preparación se ejecutan inmediatamente al cerrar la instrucción. Cuando se establece en > 1, estas llamadas se agrupan por lotes para evitar la sobrecarga de llamar sp_unprepare a demasiada frecuencia. El valor predeterminado de esta opción se puede cambiar llamando a getDefaultServerPreparedStatementDiscardThreshold(). |
| void setServerPreparedStatementDiscardThreshold(int value) | Especifica el comportamiento de una instancia de conexión específica. Esta configuración controla cuántas operaciones de descarte (sp_unprepare) puede haber pendientes en cada conexión antes de que se realice una llamada para limpiar los handles pendientes en el servidor. Si el valor es <= 1, las acciones de cancelación de preparación se ejecutan inmediatamente al cerrar la instrucción. Cuando se establece en > 1, estas llamadas se agrupan por lotes para evitar sobrecargas de llamadas sp_unprepare con demasiada frecuencia. |
Agrupación en lotes sin preparación de SQLServerDataSource
| Nuevo método | Descripción |
|---|---|
| void setEnablePrepareOnFirstPreparedStatementCall(boolean enablePrepareOnFirstPreparedStatementCall) | Si esta configuración tiene el valor false, la primera ejecución de una instrucción preparada llama a sp_executesql y no prepara una instrucción. Si se produce una segunda ejecución, llama a sp_prepare o sp_prepexec y configura un identificador de instrucción preparada. Las ejecuciones posteriores invocan sp_execute. Este comportamiento elimina la necesidad de sp_unprepare al cerrar la instrucción preparada si esta solo se ejecuta una vez. |
| boolean getEnablePrepareOnFirstPreparedStatementCall() | Si esta configuración devuelve false, la primera ejecución de una instrucción preparada llama a sp_executesql y no prepara una instrucción. Si se produce una segunda ejecución, llama a sp_prepare o sp_prepexec y configura realmente un identificador de instrucción preparado. Las ejecuciones posteriores invocan sp_execute. Este comportamiento elimina la necesidad de sp_unprepare al cerrar la instrucción preparada si esta solo se ejecuta una vez. |
| void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) | Esta configuración controla cuántas operaciones de descarte (sp_unprepare) puede haber pendientes en cada conexión antes de que se realice una llamada para limpiar los handles pendientes en el servidor. Si el valor es <= 1, las acciones de cancelación de preparación se ejecutan inmediatamente al cerrar la instrucción. Cuando se establece en > 1, estas llamadas se agrupan por lotes para evitar la sobrecarga de llamar a sp_unprepare demasiada frecuencia. |
| int getServerPreparedStatementDiscardThreshold() | Esta configuración controla cuántas operaciones de descarte (sp_unprepare) puede haber pendientes en cada conexión antes de que se realice una llamada para limpiar los handles pendientes en el servidor. Si el valor es <= 1, las acciones de cancelación de preparación se ejecutan inmediatamente al cerrar la instrucción. Cuando se establece en > 1, estas llamadas se agrupan por lotes para evitar la sobrecarga de llamar sp_unprepare a demasiada frecuencia. |
Almacenamiento en caché de metadatos de instrucciones preparadas
A partir de la versión 6.4, el controlador JDBC de Microsoft para SQL Server admite el almacenamiento en caché de instrucciones preparadas. Antes de la versión 6.4, si se ejecuta una consulta que ya está preparada y almacenada en la memoria caché, llamar a la misma consulta de nuevo no requiere la preparación de nuevo. El controlador busca la consulta en la memoria caché para buscar el identificador y ejecutarla con sp_execute.
El almacenamiento en caché de metadatos de instrucciones preparadas está deshabilitado de forma predeterminada. Para habilitarlo, llame al método siguiente en el objeto de conexión:
setStatementPoolingCacheSize(int value) //value is the desired cache size (any value bigger than 0)
setDisableStatementPooling(boolean value) //false allows the caching to take place
Por ejemplo: connection.setStatementPoolingCacheSize(10)connection.setDisableStatementPooling(false)
Lista de las nuevas API presentadas con este cambio, para el almacenamiento en caché de metadatos de instrucción preparada
Almacenamiento en caché de metadatos de SQLServerConnection
| Nuevo método | Descripción |
|---|---|
| void setDisableStatementPooling(boolean value) | Establece la agrupación de instrucciones en true o false |
| boolean getDisableStatementPooling() | Devuelve true si la agrupación de sentencias está deshabilitada. |
| void setStatementPoolingCacheSize(int value) | Especifica el tamaño de la caché de instrucciones preparadas para esta conexión. Un valor < 1 significa que no hay memoria caché. |
| int getStatementPoolingCacheSize() | Devuelve el tamaño de la memoria caché de instrucciones preparadas para esta conexión. Un valor < 1 significa que no hay memoria caché. |
| int getStatementHandleCacheEntryCount() | Devuelve el número actual de identificadores de instrucción preparada agrupados. |
| boolean isPreparedStatementCachingEnabled() | Si la agrupación de sentencias está habilitada o no para esta conexión. |
Almacenamiento en caché de metadatos SQLServerDataSource
| Nuevo método | Descripción |
|---|---|
| void setDisableStatementPooling(boolean disableStatementPooling) | Establece la agrupación de instrucciones en true o false |
| boolean getDisableStatementPooling() | Devuelve true si la agrupación de sentencias está deshabilitada. |
| void setStatementPoolingCacheSize(int statementPoolingCacheSize) | Especifica el tamaño de la caché de instrucciones preparadas para esta conexión. Un valor < 1 significa que no hay memoria caché. |
| int getStatementPoolingCacheSize() | Devuelve el tamaño de la memoria caché de instrucciones preparadas para esta conexión. Un valor < 1 significa que no hay memoria caché. |