sql >> Base de Datos >  >> RDS >> Sqlserver

¿Qué hace realmente el método Statement.setFetchSize(nSize) en el controlador JDBC de SQL Server?

En JDBC, setFetchSize(int) El método es muy importante para el rendimiento y la gestión de la memoria dentro de la JVM, ya que controla la cantidad de llamadas de red desde la JVM a la base de datos y, en consecuencia, la cantidad de RAM utilizada para el procesamiento de ResultSet.

Inherentemente, si se llama a setFetchSize(10) y el controlador lo ignora, probablemente solo haya dos opciones:

  1. Pruebe con un controlador JDBC diferente que respete la sugerencia de tamaño de búsqueda.
  2. Observe las propiedades específicas del controlador en la conexión (URL y/o mapa de propiedades al crear la instancia de conexión).

El CONJUNTO DE RESULTADOS es el número de filas ordenadas en la base de datos en respuesta a la consulta. El CONJUNTO DE FILAS es la porción de filas que se extraen del CONJUNTO DE RESULTADOS por llamada de la JVM a la base de datos. las llamadas y la RAM resultante requerida para el procesamiento dependen de la configuración del tamaño de búsqueda.

Entonces, si RESULT-SET tiene 100 filas y el tamaño de búsqueda es 10, habrá 10 llamadas de red para recuperar todos los datos, usando aproximadamente 10*{row-content-size} RAM en un momento dado.

El tamaño de búsqueda predeterminado es 10, que es bastante pequeño. En el caso publicado, parecería que el controlador está ignorando la configuración del tamaño de búsqueda, recuperando todos los datos en una sola llamada (requisito de RAM grande, llamadas de red mínimas óptimas).

Qué sucede debajo de ResultSet.next() es que en realidad no obtiene una fila a la vez del CONJUNTO DE RESULTADOS. Obtiene eso del ROW-SET (local) y obtiene el siguiente ROW-SET (invisiblemente) del servidor a medida que se agota en el cliente local.

Todo esto depende del controlador, ya que la configuración es solo una "pista", pero en la práctica he descubierto que así es como funciona para muchos controladores y bases de datos (verificado en muchas versiones de Oracle, DB2 y MySQL).