Java - Lentitud en Resulset

 
Vista:
sin imagen de perfil

Lentitud en Resulset

Publicado por Christian (1 intervención) el 10/04/2014 16:48:29
Estimados,

Yo me he conectado a varias bases de datos he realizado consultas sin problema. Cuando el resultado de la sentencia no es muy largo menos de 1000 registros.

Pero si trabajo desde 50000 registros en adelante, es muy lento. El siguiente es el codigo con el que estoy trabajando:


static Statement stmC = null;
static ResultSet rs = null;

stmC = Conexion.conDB2.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
//stmt = Conexion.conDB2.prepareStatement(sentencia);

rs = stmC.executeQuery(sentencia);

while (rs.next()){
ArrayList<String> datosOriginal = new ArrayList<String>();
int col=1;
try {
while(true){
datosOriginal.add(rs.getString(col));
col++;
}
} catch (SQLException e) {
System.err.println(e.getMessage());
}


He verificado que al recorrer cada elemento se demora demasiado. Y necesito sacar todos los datos para poder enviarlos a una nueva tabla.. segmentados.

Al poner los parametros :

createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY).

Es lo mas rapido que he logrado...

QUisiera que me ayuden..

Otra pregunta... Yo trabajo con netbeans.. Aunque en este asecto no tendria mucho que ver o me equivoco.

Cuando entro en netbeans en servicios --- bases de datos y realizo la conexion y luego la misma consulta. Me presenta los resultados inmediatamente.. Yo puedo hacer lo mismo y como???

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Lentitud en Resulset

Publicado por Tom (1831 intervenciones) el 11/04/2014 10:12:54
Pues no hay mucho que hacer ahí, precisamente hace poco he estado liado con el mismo asunto, a partir de unos 50000 registros, todo se ralentiza bastante.

Cuando haces las consultas con el gestor de Netbeans, es tan rápido porque solamente te muestra unos pocos registros, no porque esté especialmente optimizado.

En todo caso, te recomiendo:

- No obtengas todos los resultados de una vez, puedes quedarte sin memoria en tu vm. Usa:

Conexion.conDB2.setAutoCommit(false);

stmC =Conexion.conDB2. createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);

stmC.setFetchSize(10); // por ejemplo

Luego, en el bucle de las columnas, en vez de forzar una excepción, utililza getColumnCont() para saber cuantas hay:

for(int i = 0; i < rs.getColumnCount(); i++) {}

Cierra siempre los resultset en cuanto puedas:

Conexion.conDB2.rollback();
rs.close();
stmC.close();

A partir de ahí, ya es buscar otros métodos ... pero eso depende de lo que tengas que hacer y como lo estés haciendo.
Por ejemplo, puedes _no_ crear un nuevo arraylist por cada regsitro, sino tenerlo fuera:

ArrayList<String> datosOriginal = new ArrayList<String>();

while(rs.next()) {
datosOriginal.clear();
...
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lino Mondragón Flores

Lentitud en Resulset

Publicado por Lino Mondragón Flores (3 intervenciones) el 12/04/2014 02:55:05
Te recomiendo que generes un bean, generes una instancia y puedas almacenar la información.

Este tipo de consultas no debe ser problema para java, pero recuerda cuanta memoria tienes para dedicarle.

Otro punto es que tu consulta debe estar firmada y calificada para un optimo resultado.

Recuerda que meter todo en un ArrayList<string> sin tener bien definido los atributos es una sobrecarga de memoria.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lentitud en Resulset

Publicado por Mario (26 intervenciones) el 22/04/2014 17:35:00
Las consultas a base de datos muchas veces son olvidadas en el tema de rendimiento de la aplicación.

sql es un lenguaje que no es tratado muy a fondo y resulta que tiene muchas formas de optimizar y afinar las consultas que tenemos, muchas veces las razones de la lentitud son los joins a otras tablas, manejo de fechas, conversión de datos, la cardinalidad de las condiciones, etc...

te recomiento mires si tienes la forma de crear indices en tus tablas para agilizar las consultas, así mismo elimines los joins innecesarios de los queries, verificar la forma en que utilizas las fechas en las consultas, utiliza herramientas como sqldeveloper para ver el costo y el plan de ejecución del query (con F10), esto ayuda mucho a bajar los tiempos y optimizar tus consultas.

por último si puedes utilizar funciones almacenadas o funciones propias del motor de bd también ayuda bastante
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar