Compartir a través de


Almacenamiento en caché de metadatos de instrucciones preparadas para el controlador JDBC

Descargar controlador JDBC

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, para todas las consultas prepareStatement, también se envió una llamada a la cancelación de preparación. Ahora, el controlador ejecuta despreparaciones de consultas en lotes hasta el umbral ServerPreparedStatementDiscardThreshold, que tiene un valor predeterminado de 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, consulte Almacenamiento en caché de metadatos 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 a las versiones anteriores de las llamadas en todo momento a sp_prepexec estableciendo enablePrepareOnFirstPreparedStatementCall en 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 llaman a 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 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 llaman a 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. Este valor controla cuántas acciones de descarte (sp_unprepare) pueden estar pendientes por conexión antes de que se ejecute una llamada para limpiar los identificadores pendientes del servidor. Si el valor es <= 1, las acciones de cancelación de preparación se ejecutan inmediatamente en la instrucción preparada close. 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. Este valor controla cuántas acciones de descarte (sp_unprepare) pueden estar pendientes por conexión antes de que se ejecute una llamada para limpiar los identificadores pendientes del servidor. Si el valor es <= 1, las acciones de cancelación de preparación se ejecutan inmediatamente en la instrucción preparada close. Cuando se establece en > 1, estas llamadas se agrupan por lotes para evitar sobrecargas de llamadas sp_unprepare con demasiada frecuencia.

SQLServerDataSource desprepare el procesamiento por lotes

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 llaman a sp_execute. Este comportamiento elimina la necesidad de sp_unprepare cerrar la instrucción preparada si la instrucción 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 llaman a sp_execute. Este comportamiento elimina la necesidad de cerrar la instrucción preparada con sp_unprepare si la instrucción solo se ejecuta una vez.
void setServerPreparedStatementDiscardThreshold(int serverPreparedStatementDiscardThreshold) Este valor controla cuántas acciones de descarte (sp_unprepare) pueden estar pendientes por conexión antes de que se ejecute una llamada para limpiar los identificadores pendientes del servidor. Si el valor es <= 1, las acciones de cancelación de preparación se ejecutan inmediatamente en la instrucción preparada close. Cuando se establece en > 1, estas llamadas se agrupan por lotes para evitar la sobrecarga de llamar a sp_unprepare demasiada frecuencia.
int getServerPreparedStatementDiscardThreshold() Este valor controla cuántas acciones de descarte (sp_unprepare) pueden estar pendientes por conexión antes de que se ejecute una llamada para limpiar los identificadores pendientes del servidor. Si el valor es <= 1, las acciones de cancelación de preparación se ejecutan inmediatamente en la instrucción preparada close. 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. Instrucción preparada el almacenamiento en caché de metadatos 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(valor booleano) Establece la agrupación de instrucciones en true o false.
boolean getDisableStatementPooling() Devuelve true si la agrupación de instrucciones 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() // Obtiene el número de entradas en la caché de controladores de sentencias Devuelve el número actual de identificadores de instrucción preparada agrupados.
boolean isPreparedStatementCachingEnabled() Especifica si la agrupación de instrucciones 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 instrucciones 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é.

Consulte también

Mejora del rendimiento y la confiabilidad con el controlador JDBCRendimiento de los parámetros de las instrucciones preparadas