Java JDBC ignora setFetchSize?

Estoy usando el siguiente código

st = connection.createStatement( ResultSet.CONCUR_READ_ONLY, ResultSet.FETCH_FORWARD, ResultSet.TYPE_FORWARD_ONLY ); st.setFetchSize(1000); System.out.println("start query "); rs = st.executeQuery(queryString); System.out.println("done query"); 

La consulta devuelve una gran cantidad de (800k) filas y lleva mucho tiempo (~ 2m) entre la impresión de “consulta de inicio” y “consulta realizada”. Cuando coloco manualmente un “límite 10000” en mi consulta, no hay tiempo entre “inicio” y “hecho”. Procesar los resultados lleva tiempo, así que supongo que en general es más rápido si solo obtiene 1k filas de la base de datos, las procesa y cuando se está quedando sin filas puede obtener nuevas en segundo plano.

El ResultsSet.CONCUR_READ_ONLY, etc. donde fue mi última suposición; ¿Me estoy perdiendo de algo?

(es un servidor postgresql 8.3)

Intenta desactivar la confirmación automática:

 // make sure autocommit is off connection.setAutoCommit(false); st = connection.createStatement(); st.setFetchSize(1000); System.out.println("start query "); rs = st.executeQuery(queryString); System.out.println("done query"); 

Referencia

Las dos consultas hacen cosas completamente diferentes.

Usar la cláusula LIMIT limita el tamaño del conjunto de resultados a 10000, mientras que configurar el tamaño de búsqueda no, en su lugar da una pista al conductor diciendo cuántas filas buscar a la vez al iterar a través del conjunto de resultados , que incluye todos los 800k filas

Entonces, al usar setFetchSize , la base de datos crea el conjunto completo de resultados, por eso lleva tanto tiempo.

Edite para mayor claridad: establecer el tamaño de búsqueda no hace nada a menos que repita el resultado (vea el comentario de Jon), pero crear un conjunto de resultados mucho más pequeño a través de LIMIT hace una gran diferencia.

Esto dependerá de tu controlador. De los documentos:

Le da al controlador JDBC una pista sobre el número de filas que se deben recuperar de la base de datos cuando se necesitan más filas. La cantidad de filas especificadas afecta solo a los conjuntos de resultados creados con esta statement. Si el valor especificado es cero, la sugerencia se ignora. El valor por defecto es cero.

Tenga en cuenta que dice “una pista”: supongo que un conductor puede ignorar la pista si realmente lo quiere … y parece que eso es lo que está sucediendo.

Noté que tu uso de la API es diferente de lo que expresa Javadoc:

Intenta pasar los parámetros en este orden

  ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.FETCH_FORWARD