En JDBC, el método setFetchSize(int)
es muy importante para el rendimiento y la administración de memoria dentro de la JVM, ya que controla el número de llamadas de la JVM a la base de datos y la cantidad de RAM utilizada para el procesamiento ResultSet.
Intrínsecamente si setFetchSize (10) se está llamando y el conductor hace caso omiso de ella, es probable que haya sólo dos opciones:
- probar un controlador JDBC diferente que honrará la indirecta de búsqueda hacia tamaño.
- 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 RESULTADO-SET es el número de filas ordenadas en la base de datos en respuesta a la consulta. El ROW-SET es el fragmento de filas que se extraen de RESULT-SET por llamada de la JVM a la base de datos. El número de estas llamadas y la RAM resultante requeridas para el procesamiento dependen de la configuración del tamaño de búsqueda.
Así que 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, utilizando aproximadamente 10 * {row-content-size} RAM en cualquier momento hora.
El tamaño de captación predeterminado es 10, que es bastante pequeño. En el caso publicado, parece que el controlador está ignorando la configuración del tamaño de búsqueda, recuperando todos los datos en una llamada (requisito de RAM grande, llamadas de red mínimas óptimas).
Lo que sucede debajo de ResultSet.next()
es que en realidad no va a buscar una fila a la vez desde RESULT-SET. Lo obtiene del SET DE FILA (local) y obtiene el siguiente JUEGO DE FILA (de forma invisible) 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 encontrado que así es como funciona para muchos controladores y bases de datos (verificado en muchas versiones de Oracle, DB2 y MySQL).
No sé Postgres, pero ... la configuración de confirmación automática no debe tener ninguna referencia en una instrucción SELECT y/o tamaño de búsqueda de búsqueda (no están realmente relacionados). –
@jwaddell ¿Es esto 'Si la confirmación automática en la Conexión está activada, entonces setFetchSize no tendrá ningún efecto.' También es cierto para 'Oracle 11g'? –
Commit es una función de los estados-manipulación-lenguaje de datos (DML) como INSERT, UPDATE, DELETE en la base de datos de dos fase de confirmación (2PC). Esto no tiene nada que ver con las consultas, que es lo que "fetch" está relacionado con "SELECT". Por lo tanto el valor de auto-entrega (sentencia DML es auto-cometido en la ejecución frente a tener que ejecutar una confirmación por separado a partir de entonces) no tiene nada que ver con ir a buscar en Oracle, MySQL o SQL Server y probablemente cualquier otro RDBMS. –