Consulta de mas de 50 mil registros

2,236 views
Skip to first unread message

William Diaz Pabón

unread,
Apr 28, 2009, 5:14:11 PM4/28/09
to jav...@googlegroups.com
Buenas tardes.

Necesito hacer una consulta pero me da el siguiente error: Caused by: java.lang.OutOfMemoryError: Java heap space

Se le acaba la memoria de la maquina virtual de java porque la consulta deberia retornar 50349 registros.

Como hago para ejecutar la consulta pero de 100 en 100 registros para no colgar a la maquina virtual?

Yo uso jdk 1.5.14, Spring 1.3.8 + Oracle

Gracias por sus aportes

--
Cordialmente.


William Diaz Pabón
Gerente de Tecnología
InfoTech Soluciones Ltda.
Cel: 3173314172
Tunja - Boyacá - Colombia
http://www.infotechsoluciones.com
Tutoriales Técnicos:
http://tutorialestecnicos.blogspot.com/

Favio DeMarco

unread,
Apr 28, 2009, 5:30:22 PM4/28/09
to jav...@googlegroups.com
Core J2EE Patterns - Value List Handler
http://java.sun.com/blueprints/corej2eepatterns/Patterns/ValueListHandler.html
http://java.sun.com/blueprints/patterns/ValueListHandler.html

Pagination using JDBC and JSP
http://www.javaranch.com/journal/2008/08/pagination-using-JDBC-and-JSP.html

The VM prints "OutOfMemoryError" and exits. Increasing max heap size
doesn't help. What's going on?
http://java.sun.com/docs/hotspot/HotSpotFAQ.html#gc_oom

17.1.2 Oracle JDBC Implementation Overview for Result Set Enhancements
http://download-east.oracle.com/docs/cd/B14117_01/java.101/b10979/resltset.htm#sthref1523

2009/4/28 William Diaz Pabón <wid...@gmail.com>:

William Diaz Pabón

unread,
Apr 28, 2009, 7:21:06 PM4/28/09
to jav...@googlegroups.com
Muchas gracias, eso era lo que estaba buscando.

2009/4/28 Favio DeMarco <fav...@gmail.com>

QuiQue

unread,
Apr 29, 2009, 5:54:23 AM4/29/09
to jav...@googlegroups.com
una cosa, que yo lo he vivido en mis carnes, y que al decirlo seguro que me costara algun que otro comentario en contra...

para manejar cantidades ingentes de datos, java es un poco... como lo diria... UNA MIERDA

me explico:

si tu haces esto:
for (int i=0; i<1000000; i++) {
  System.out.println("iteracion: " + i);
}

es muy probable que obtengas un java heap memory. si lo metes en una lista, es decir, el mismo bucle pero en lugar de imprimir una traza guardarlo en una lista, te dara casi seguro el mismo error porque la lista se llenara/colapsara. es decir, java no maneja bien grandes cantidades de datos y no tiene ninguna clase que los optimice. alguien puede pensar que para que quiero yo 1 millon de datos, pero eso es lo mismo que tener una matriz de por ejemplo 10.000 datos con 100 datos cada uno, lo cual ya no parece tan disparatado no?

y la paginacion es un poco engañosa, es decir, muchos motores de base de datos te devuelven todos los datos y luego mediante java le dices que te devuelva solo 100, pero si ya te has traido todos los datos ya la has cagado porque te puede dar el consabido problema de memoria. asi que realmente la paginacion, o mejor dicho, realmente los datos que te debes de traer son solo los que de verdad vas a usar y eso lo consigues mediantes querys, no mediante java (cada motor de bdd suele tener una manera en que la query solo te devuelva el numero de registros que quieras).

y respecto a ampliar la memoria del servdior, que no de tu entorno de desarrollo, pues es pan para hoy y hambre para mañana, es decir, primero tienes que contar con que el servidor solo se use para tu aplicacion porque si se usa para mas cosas puede que las perjudiques notablemente al destinar memoria a java. y en segundo lugar, cuando estas manejando muchisimos datos puede que una ampliacion te resuelva el problema en primera instancia, pero cuando tienes muchos datos lo normal es que crezcan mucho mas, asi que tarde o temprano la ampliacion de memoria se te volvera a quedar corta

esta ha sido mi experiencia en el manejo de cantidades enormes de datos en java y tan solo espero que te pueda ayudar en algo, no pretendo crear polemica sobre nada

saludos

QuiQue
--

saludos

QuiQue

Juan Montanaro

unread,
Apr 29, 2009, 8:11:09 AM4/29/09
to jav...@googlegroups.com
Tampoco quiero generar una polémica, pero hablar de que "java maneja mal muchos datos " ........ es medio arbitrario, digo, no?

o sea, al decirle a una persona que trabaja mal llevando cajas de 1 tonelada porque no las puede levantar......... es como que si no le doy la forma de hacerlo no le puedo echar la culpa .........

o sea, para mi va más allá de la tecnología .......  si esa matriz de 10000 x100 la llenas con registros de 10 megas, cada uno, en java, en C en lo que quieras va a volar salvo que lo prepares para eso , que lo tengas en cuenta....... lo que pasa es que en las distintas tecnologías se prepara de distinta forma

en otros laburos he manejando grandes volúmenes de datos y las veces que tuve problema de memoria fueron solucionadas optimizando tanto la programación como la configuración ......
por ejemplo, hablamos de procesar 3000 xml's de 500kb cada uno por hora ........ con la tecnología que quieras no va a ser trivial su manejo ........ o cargar cada día el padrón de contribuyentes de la provincia de buenos aires, con 1500000 registros ...... y mantener 2 copias en memoria ........ también, con lo que quieras vas a tener que tener cuidado .........


se que cada uno tuvo sus experiencias , y ta perfecto, pero que se yo.......


también tendrías que tener en cuenta que no solo la memoria puedes hacer crecer, si no también decirle a "java" cómo manejarla ...... Xmx no es el único parámetro a tocar

saludos

Claudio Fernandez

unread,
Apr 29, 2009, 8:14:53 AM4/29/09
to jav...@googlegroups.com
Y en cuanto a las consultas paginadas, que el montor haya tenido que resolver toda la query no significa que tu aplicación cliente (este hecha en el lenguaje que esté hecha) tenga que traerse todos los registros si va a mostrar solo 100. Por eso el tema de los cursores, vioh? JDBC mal que mal maneja eso bastante decentemente.


2009/4/29 QuiQue <quiqu...@gmail.com>

Fabricio

unread,
Apr 29, 2009, 8:25:15 AM4/29/09
to jav...@googlegroups.com

QuiQue

unread,
Apr 29, 2009, 9:38:06 AM4/29/09
to jav...@googlegroups.com
pues yo sigo pensando que lo que estais enviando gestiona los datos mediante java, es decir, primero se trae todo y luego dice "dame solo 100", pero tu ya tienes todos los registros

cuando haces una query, como todos vosotros sabeis, se abre una conexion (virtual o fisica) y esa conexion, cuando tiene muchos registros, crece y crece hasta dar un problema de memoria.

y tampoco me estoy refiriendo a traerme millones de datos con 500k cada uno, es tan sencillo como probar el trozo de codigo que he puesto, que no hace mas que crear un contador. y probarlo con distintas clases (vector, list, arraylist, collection, etc)

mi entorno es eclipse europa 3.3, el pc tiene 2 gigas de ram, y java tiene reservado el standar que viene por defecto (512). si lo subes, arregla un poco el problema pero volvemos a lo que ya he dicho antes de pan para hoy y hambre para mañana.

yo tan solo cuento mi experiencia, me he tenido que enfrentar a ese problema y me las vi y me las desee para solucionarlo, y la unica solucion mediodecente que encontre fue traerme solo las columnas que necesitaba y siempre mediante sentencias delmotor de la badd, nunca de java

por favor, si alguien tiene un trozo de codigo que solucione esto que me lo mande, por aqui o por privado, qu ede verdad que tengo curiosidad por saber como lo hubiera podido solucionar

y luego todo esto se puede complicar hasta el punto que querais, porque si tu aplicacion ademas hace mas cosas, o crea hilos, o tiene un alto nivel de usuarios concurrentes pues ya ni te cuento
--

saludos

QuiQue

Favio DeMarco

unread,
Apr 29, 2009, 10:51:47 AM4/29/09
to jav...@googlegroups.com
http://en.wikipedia.org/wiki/Time-space_tradeoff
algunas cosas que podés hacer son
- carga lazy de los datos, utilizando proxies como hacen los appservers por ej.
- una arquitectura pipe and filter, "streameando" los datos
- divide and conquer
- etc.
hay otras opciones, es cuestión de investigar, analizar las
características del problema puntual, etc.
lo más probable es que termines utilizando una combinación de varias técnicas

creo que sería interesante que plantees un caso puntual

2009/4/29 QuiQue <quiqu...@gmail.com>:

QuiQue

unread,
Apr 29, 2009, 11:10:31 AM4/29/09
to jav...@googlegroups.com
pues el caso fue mas o menos lo que os decia: teniamos una aplicacion que mostraba estadisticas de plazos muy amplios (por ejemplo, anuales) por lo que para calcular los datos a mostrar necesitabamos los datos de todo ese año. y por cada "dia" necesitabamos diversos datos. total, que teniamos una matriz de AxB

lo primero que hicimos fue hacer una sola query: java heap memory
lo segundo que hicimos fue hacer varias querys mediante java (decirle que me devolviera solo x columnas): java heap memory.
en ambos puntos no llegabamso a recorrernos lo que nos devolvia la query si no que los resultados devueltos por la query eran tan grandes que desbordaba el buffer de comunicacion entre redes.
lo tercero que hicimos fue hacer varias querys mediante el propio motor de la base de datos. aqui conseguimos que la red no se colapsara, pero al ir guardandolas en una collection o un array se desbordaba. fue entonces cuando probamos el codigo que os he enviado antes y vimos que las clases java no soportaban tal cantidad de datos
a partir de aqui, hicimos todas las ñapas que se nos iban ocurriendo, una mezcla de todas: hicimos varias querys sacando columnas mediante la bdd. despues, mediante ajax, segun donde pulsaba el usuario (por ejemplo, en un scroll) ibamos haciendo de manera "transparente" consultas a la base de datos, de manera que no colapsamos la base de datos y el usuario ve los datos en tiempo cuasireal

en resumen, que nos las vimos y deseamos paera medioparchear, que no arreglar, estos problemas

existe mucha literatura (o no tanta), muchos patrones muy bonitos, pero en la practica no conseguimos dar con nada que nos resolviera el problema. la aplicacion era una migracion de otra desarrollada en delphi, y delphi hacia todo esto de manera mucho mas optima que java

repito: si alguno tiene un trozo de codigo que arregle esto que por favor me lo envie que de verdad que estoy muy interesado en saber como solucinar esto

p.d: la optimizacion de codigo ni la nombro porque la presupongo a todos los que estamos debatiendo esto, o al menos a mi si :)
--

saludos

QuiQue

Pablo Ruggia

unread,
Apr 29, 2009, 11:30:20 AM4/29/09
to jav...@googlegroups.com
Quique, con todo respeto, pero me parece que estas siendo un poco alarmista y escribiendo cosas con muy pocos fundamentos.

JDBC maneja la paginacion perfectamente y las base de datos van devolviendo los registros poco a poco sin ningun tipo de problema. Se pueden hacer queries que devuelven millones de registros sin tirar ninguna comunicacion de red ni tu memoria al carajo.

En cuanto a programas que ocupen mucha memoria tenes los mismos problemas entre Java y C, si tratas de usar mas memoria de la que tenes empieza a paginar y tu proceso no termina nunca. Por lo menos en Java podes setear el heap cosa de explote solito antes de tardar una eternidad. Tenes razon con lo de que tenes que saber cual es el entorno de tu servidor, pero eso es verdad para cualquier aplicacion en cuaquier plataforma. Subir el heap no es pan para hoy hambre para maniana, es inidicar que existe un requerimiento de memoria y si no tu programa no va a funcionar, asi de simple, tiene sentido. Si necesitas mas memoria vas a tener que usar disco, pero de vuelta, en C te pasa lo mismo.

Y bueno, la afirmacion de que java no es bueno para manejar enormes cantidades de datos es sencillamente nefasta, existen millones de ejemplos de aplicaciones que manejan Terabytes de datos en Java.

2009/4/29 QuiQue <quiqu...@gmail.com>

Federico Martinez

unread,
Apr 29, 2009, 11:36:59 AM4/29/09
to jav...@googlegroups.com
Pues amigo mio, si estas utilizando MySQL no desaproveches las ventajas que te da la clausula LIMIT para que la consulta solo te regrese la cantidad de registros que necesitas en cada paginacion sin tener que cargar todos los resultados de un jalon.


Saludos!


PD. Si no estas usando MySQL que lastima por que es de las mejores BDs del mundo.

QuiQue

unread,
Apr 29, 2009, 11:43:55 AM4/29/09
to jav...@googlegroups.com
pablo, no hace falta que seas tan cortes... no me voy a sentir ofendido porque haya disparidad de criterios, para eso dios creo los colores y alguien este foro :)

dicho esto, me repito en mi comentario: que alguien me mande un trozo de codigo para tontos en donde yo lo pueda entender, porque hasta donde yo se, que seguro que es insuficiente, si yo tengo mi app en un server en una maquina, y tengo la base de datos en otra maquina, jdbc abre un canal de comunicacion. si la consulta es mastodontica, como era mi caso, ese canal se desborda, como me paso a mi. si tienes algun ejemplo que no haga esto mandamelo

por otra parte, si quieres paginar desde java te tienes que traer primero todo y luego decirle que solo quieres X. por tanto, sigues teniendo el problema de antes

a mi solo me funciono medianamente bien el coger solo ciertas columnas usando instrucciones de sql, que por cierto cada motor suele tener las suyas y tambien es un pifostio dar con la apropiada

pero vamos, que de verdad que no me pagan por dar por saco, solo cuento mi experiencia y deseo que alguien me mande algo practico que me saque de mi ignorancia, sobre todo porque la proxima vez que me ocurra algo asi sabre solucionarlo a la primera

por cierto, alguien probo el tan sencillo ejemplo de codigo que mande? yo ya os dije cual es mi entorno y eso me da un heap memory, probarlo en los vuestros y me decis
--

saludos

QuiQue

Pablo Ruggia

unread,
Apr 29, 2009, 12:05:16 PM4/29/09
to jav...@googlegroups.com
El codigo que pegaste corre bien, lo que tiene sentido porque no deberia ocupar memoria, no estas guardando nada, solo usando siempre la misma variable e incrementandola.
public class Prueba {
    public static void main(String[] args) {

        for (int i=0; i<1000000; i++) {
          System.out.println("iteracion: " + i);
        }
    }
}
Por ahi lo que te esta volando puede ser el eclipse si pusiste que la consola que muestre tooodo el output en vez de limitarlo a N lineas.

En cuanto a lo de jdbc, probablemente diferentes drivers con diferentes bases de datos funcionen distinto, pero siempre hay una forma de no traerte los resultados, sea mediante la api de jdbc o vos limitando la cantidad de resultados y el offset en la query.

2009/4/29 QuiQue <quiqu...@gmail.com>

QuiQue

unread,
Apr 29, 2009, 12:10:45 PM4/29/09
to jav...@googlegroups.com
bueno, solo una pequeña correcion, que ya lo dije en el email pero efectivamente pegue mal el codigo

en lugar de poner una traza, guardalo en una lista
List l = new ArrayList();

for (int i=0; i<1000000; i++) {
          l.add(i);
        }

y dime si se te desborda la lista o no

respecto a las trazas de eclipse, no las limite, es que directamente las quite todas.

respecto a limitar lso resultados por java sigo sin saber como hacerlo. lo de limitarlas mediante la query es lo que ya os he dicho que al final hice (limit mysql, rownum oracle, y una subconsulta en sqlserver, ya que mi app era multiplataforma)
--

saludos

QuiQue

Esteban Risso

unread,
Apr 29, 2009, 12:15:21 PM4/29/09
to jav...@googlegroups.com

Que tal Quique, por lo que estoy entendiendo de tu caso, me parece que el problema pasa por otro lado y no por java. Si vos haces un SELECT * FROM XXX que te devuelve muchísimos registros y la red se te colapsa entonces el problema es de red, porque es el mismo caso que si copias un archivo grande y lo pasas por red.

 

Caso de red:

      1) Suponete que haces un SELECT que te devuelve 10GB de información y la red se cuelga.

      2) Entonces si copias un archivo de 10GB de información la red también se te va a colgar dado que para el la red no hay diferencia, son todos Bytes.

      3) Por lo tanto el problema ya se escapa de la base de datos, lenguaje, sistema particular que hayas desarrollado.

      Solución) Quizás tendrías que pensar en algo conocido como QoS (Quality of Service) para asegurar una velocidad de transmisión mínima para todos lo que usen dicha red.

 

Caso del HEAP:

      1) Hace algunos años había estado viendo el tema de los servicios de NT y los drivers de base de datos en otro trabajo que tuve, y si el driver esta bien hecho no tendrías por qué tener problemas. Por lo general los drivers tienen la suficiente inteligencia como para hacer que las cosas funcionen bien (Hacen los fetch cuando corresponde y te paginan la consulta sin que vos se lo pidas).

      2) Además la conexión a la base la resuelve el driver, no el lenguaje por lo que quizás el tema venga por ese lado.

     

Caso de que Java es una mierda:

      Hay cosas que podrían estar mejor pero como no hay otro que esté tan extendido en tantas plataformas con similares características que java, entonces no se puede hacer una comparación justa.

 

-----Mensaje original-----
De: QuiQue [mailto:quiqu...@gmail.com]
Enviado el: miércoles, 29 de abril de 2009 12:44
Para: jav...@googlegroups.com
Asunto: [JavaSOS] Re: Consulta de mas de 50 mil registros

NOTA DE RESPONSABILIDAD: El contenido del presente mensaje es privado, 
estrictamente confidencial y exclusivo para su destinatario. Este 
mensaje puede contener información protegida por normas legales 
y/o de secreto profesional y es sólo para su destinatario. El emisor 
no asume responsabilidad ni obligación legal alguna por cualquier
información incorrecta o alterada contenida en este mensaje. Si 
usted no es el destinatario de este mensaje, por favor elimínelo, no
lo copie ni lo haga conocer a terceros e informe al emisor. 
Muchas gracias.

Claudio Fernandez

unread,
Apr 29, 2009, 12:22:10 PM4/29/09
to jav...@googlegroups.com
1. respecto a limitar lso resultados por java sigo sin saber como hacerlo. lo de limitarlas mediante la query es lo que ya os he dicho que al final hice (limit mysql, rownum oracle, y una subconsulta en sqlserver, ya que mi app era multiplataforma)

Depende. Si usas JDBC de forma directa, entonces los limitas como te permita el SQL que soparta tu motor limitarlo. No hay un estandar de esto y ningun fwk que se limite solo a tirar consultas como JDBC te va a dar mucho soporte ahi. En Oracle tendras que usar la subquery con rownum, en Limit el top, en SLQ Server 2000 suicidarte, etc...

Ahora! Siempre podes construir una capa de abstracción sobre eso, y crear algo que se encargue de disparar consultas abstrayendote de como setea la paginación. Deben de haber varias librerías o fwks por ahí que ya se encarguen (de hecho, hibernate lo hace, pero usar hibernate solo para eso es un despropocito).

Las herramientas estan disponibles, y las limitaciones tecnicas no son muy superiores a las de otros ambientes (incluso aquellos de memoria no manejada como C). Vas a tener siempre el mismo problema! Pero eso no te quita poder construir/propiciarte algo que te abstraiga de lidiar con eso. La falencia no es java, sino tu diseño en este caso.

2. Una lista desborda? QUE?


    public static void main(String[] args) {
        long startTime = System.nanoTime();
        List<Integer> lista = new LinkedList<Integer>();
        for (int i = 0; i < 10000000 ; i++) {
            lista.add(i);
        }
        System.out.println("Took: " + (System.nanoTime() - startTime / 100000.0) + " ms");
        System.out.println("Size: " + lista.size());
    }

Mirá:

Took: 1.7806198243922128E14 ms
Size: 10000000

... con ArrayList instead:

Took: 1.7813854148980412E14 ms
Size: 10000000

... sin siquiera aumentar el heap a nada. Estas seguro de lo que decis??? Ahora, si son un millon de fotos de Pamela Anderson en bolas de alta definición, ahí ya no se.

2009/4/29 QuiQue <quiqu...@gmail.com>

QuiQue

unread,
Apr 29, 2009, 12:23:02 PM4/29/09
to jav...@googlegroups.com
hola esteban

el caso de red puede ser, pero no es competencia mia y no puedo hacer nada al respecto. si ni siquiera nosotros nos ponemos de acuerdo imaginate contarle a un adminsitrador de red estos temas!! jajaja fliparia conmigo!!!

el caso de los drivers, uso los "oficiales", es decir, el de la web de mysql para mysql, el de la web de oracle para oracle, y el de la web de sqlserver para sqlserver. solo trabajo con esos 3

la expresion "java es una mierda"... bueno, no ha sido una expresion muy politicamente correcta por mi parte eso esta claro, pero es lo que senti mientras sudaba la gota gorda intentando arreglar el problema y viendo a su vez como delphi lo resolvia sin ningun problema
--

saludos

QuiQue

Claudio Fernandez

unread,
Apr 29, 2009, 12:23:47 PM4/29/09
to jav...@googlegroups.com
Y en cuanto a lo de "me cuelga la red / lo que sea". La respuesta es sencilla, un result set forward only y un fetch size aceptable. Y si, procesar los registros on the fly, si devuelve 1000000 de fotos de pamela anderson no te las guardes en la lista ;).

2009/4/29 Claudio Fernandez <clau...@gmail.com>

Claudio Fernandez

unread,
Apr 29, 2009, 12:24:29 PM4/29/09
to jav...@googlegroups.com
Ojo con los drivers oficiales de SQLServer, apestan =/. IMHO, analiza JTDS.

2009/4/29 QuiQue <quiqu...@gmail.com>

QuiQue

unread,
Apr 29, 2009, 12:25:58 PM4/29/09
to jav...@googlegroups.com
mierda claudio! me pillaste! todo era culpa de pam!!!

jajajaj

lo dicho, mandarme codigo que lo pruebo, que por hoy creo que ya esta bien de literatura

p.d: a mi ese bucle se me desborda en el entorno que te puse antes, cual tienes tu?
--

saludos

QuiQue

Esteban Risso

unread,
Apr 29, 2009, 12:25:36 PM4/29/09
to jav...@googlegroups.com

Solo como comentario, en SQL podes usar TOP xxxx para limitarla, por ejemplo: SELECT TOP 100 ............

 

-----Mensaje original-----
De: Claudio Fernandez [mailto:clau...@gmail.com]
Enviado el: miércoles, 29 de abril de 2009 13:22


Para: jav...@googlegroups.com
Asunto: [JavaSOS] Re: Consulta de mas de 50 mil registros

 

1. respecto a limitar lso resultados por java sigo sin saber como hacerlo. lo de limitarlas mediante la query es lo que ya os he dicho que al final hice (limit mysql, rownum oracle, y una subconsulta en sqlserver, ya que mi app era multiplataforma)



Depende. Si usas JDBC de forma directa, entonces los limitas como te permita el SQL que soparta tu motor limitarlo. No hay un estandar de esto y ningun fwk que se limite solo a tirar consultas como JDBC te va a dar mucho soporte ahi. En Oracle tendras que usar la subquery con rownum, en Limit el top, en SLQ Server 2000 suicidarte, etc...

Ahora! Siempre podes construir una capa de abstracción sobre eso, y crear algo que se encargue de disparar consultas abstrayendote de como setea la paginación. Deben de haber varias librerías o fwks por ahí que ya se encarguen (de hecho, hibernate lo hace, pero usar hibernate solo para eso es un despropocito).

Las herramientas estan disponibles, y las limitaciones tecnicas no son muy superiores a las de otros ambientes (incluso aquellos de memoria no manejada como C). Vas a tener siempre el mismo problema! Pero eso no te quita poder construir/propiciarte algo que te abstraiga de lidiar con eso. La falencia no es java, sino tu diseño en este caso.

2. Una lista desborda? QUE?

    public static void main(String[] args) {
        long startTime = System.nanoTime();
        List<Integer> lista = new LinkedList<Integer>();
        for (int i = 0; i < 10000000 ; i++) {
            lista.add(i);
        }
        System.out.println("Took: " + (System.nanoTime() - startTime / 100000.0) + " ms");
        System.out.println("Size: " + lista.size());
    }

Mirá:

Took: 1.7806198243922128E14 ms
Size: 10000000

... con ArrayList instead:

Took: 1.7813854148980412E14 ms
Size: 10000000

... sin siquiera aumentar el heap a nada. Estas seguro de lo que decis??? Ahora, si son un millon de fotos de Pamela Anderson en bolas de alta definición, ahí ya no se.

2009/4/29 QuiQue <quiqu...@gmail.com>

respecto a limitar lso resultados por java sigo sin saber como hacerlo. lo de limitarlas mediante la query es lo que ya os he dicho que al final hice (limit mysql, rownum oracle, y una subconsulta en sqlserver, ya que mi app era multiplataforma)



QuiQue

unread,
Apr 29, 2009, 12:26:29 PM4/29/09
to jav...@googlegroups.com
uno puede apestar, los 3 es raro raro raro...
--

saludos

QuiQue

QuiQue

unread,
Apr 29, 2009, 12:28:34 PM4/29/09
to jav...@googlegroups.com
si, eso tambien lo probe, pero creo recordar que eso siempre te devolvia los registros que pusieras  en el top y no los que te corresponde

me explico: si pones top 100, te devuelve la priemra vez del 0-99. pero la segunda vez te devuelve del 0-99 otra vez, y yo la sgeunda vez los que quiero son del 100-199
--

saludos

QuiQue

Claudio Fernandez

unread,
Apr 29, 2009, 12:29:19 PM4/29/09
to jav...@googlegroups.com
No no no, nada que ver con el asunto este. Tiene otros problemas.

2009/4/29 QuiQue <quiqu...@gmail.com>

Claudio Fernandez

unread,
Apr 29, 2009, 12:30:29 PM4/29/09
to jav...@googlegroups.com
Si ejecutas dos veces la consulta con el TOP 100 desde tu SQL Server Manager o la interfaz de query que queiras... te devuelve distintos registros?

2009/4/29 QuiQue <quiqu...@gmail.com>

QuiQue

unread,
Apr 29, 2009, 12:32:48 PM4/29/09
to jav...@googlegroups.com
acabo de probarlo y la respuyesta es si... por?

bueno chicos, un placer "discutir" con vosostros, termino mi jornada laboral... ciao
--

saludos

QuiQue

Claudio Fernandez

unread,
Apr 29, 2009, 12:34:26 PM4/29/09
to jav...@googlegroups.com
QUE?!?!?! Fijate, creo que estás parado en un Vortex

2009/4/29 QuiQue <quiqu...@gmail.com>

cot...@gmail.com

unread,
Apr 29, 2009, 1:11:16 PM4/29/09
to jav...@googlegroups.com

En NETBEANS sin tocar nada el BUCLE funciona perfectamente, si lo aumento  a 10 millones se cae ...

En el trabajo resolvimos el problema de transporte a punta de QUERY, con el rowid de ORACLE, manteniendo un puntero de los últimos registros consultados.

Lo decidimos así suponiendo que en el cliente nunca se necesitarían TERAS de información.

Eso si para calculos grandes estadísticos que tienen que tomar  en cuenta la vida y obra de los históricos, decidimos trabajarlo directamente en BD, y devolver solamente el resultado.

Saludos,




2009/4/29 Claudio Fernandez <clau...@gmail.com>

Oscar Berganza

unread,
Apr 29, 2009, 1:23:10 PM4/29/09
to jav...@googlegroups.com
HOLA AMGIO.
 
SE VE QUE TODOS AQUI ESTAN UN POCO PERDIDOS
PARA UN MANEJO DE DATOS TAN GRANDE LO QUE DEBEMOS HACER
 ES LO SIGUINTE:
 
SABER QUE BASE DE DATOS UTILIZAS, SUPONIENDO QUE ORACLE
´PUEDES USAR ROWNUM, este comando te da el numero de fila de un select en farticualar
 
SIGUE ESTE LINK
 
EJEMPLO
--Esto te dara cada
select
  rownum, column_1, column_2
from
  table_1, table_2
where
  field_3 = 'some value'
para seguir haciendo esto, por ejemplo si la primera vez que hiciste el select obtuviste 10 tuplas
la segunda vez deberas poner asi
 
select
  column_1, column_2
from
  table_1, table_2
where
  field_3 = 'some value'
and rownum > 10


 



--
Oscar E. Berganza Cardona

fav

unread,
Apr 29, 2009, 9:34:37 PM4/29/09
to JavaSOS
Lo de la lista es literalmente como hacer un malloc en C y pedir más
memoria que la que hay disponible, tenés dos manos y tres valijas.
Este es un caso similar <http://donsbot.wordpress.com/2008/05/06/write-
haskell-as-fast-as-c-exploiting-strictness-laziness-and-recursion/>,
sobre obtener el promedio de los valores almacenados en un archivo. La
solución elegante, y naïve, consume toda la memoria disponible y no
termina, pues mantiene una referencia al comienzo de la lista que hace
que se mantenga toda la lista en memoria hasta el final de la
ejecución. Cambiando esto último más un poco de tunning logra tener
mínimo footprint y ser tan rápido como C.
Hace poco hubo una discusión sobre leaks de memoria y análisis del
heap <http://groups.google.com/group/javasos/browse_thread/thread/
981e56585fe5941d> ¿qué técnicas usaste? ¿usaste algún profiler? ¿qué
resultados obtuviste? ¿realmente son los drivers jdbc los que
mantienen los objetos en memoria?
¿Necesitás mantener tantas cosas en memoria? ¿no hay cosas que puedas
calcular en vez de mantener en memoria? ¿que puedas pasivar y volver a
pedir recién cuando las volvés a necesitar?
¿O estás creando y destruyendo objetos a un ritmo que el gc no puede
manejar? ¿probaste utilizando pooles para esos objetos? ¿un gc más
agresivo?
Estos problemas no son nuevos, están ampliamente documentados, podés
encontrar más ideas en el capítulo 5 de Software Exorcism, de Blunden,
o media docena de libros sobre performance en java <http://
www.amazon.com/s/ref=nb_ss_gw?url=search-alias%3Dstripbooks&field-keywords=java+performance>,
por ejemplo.
Y sí, más memoria sí es una solución, aunque sea porque "Hardware is
Cheap, Programmers are Expensive" <http://www.codinghorror.com/blog/
archives/001198.html>
¿Cuánto cuesta un GB de RAM y cuánto las horas que perdiste tratando
de ahorrarlo?

Israel Luna

unread,
Apr 29, 2009, 10:33:18 PM4/29/09
to jav...@googlegroups.com
Hay un método de paginación, muy sencillo para Oracle, te arrojara los datos como le pongas, solo tendrías que hacer la tabla que te vaya paginando.
 
Este es el select del cual te hablo:
select *
from ( select a.*, rownum rnum
from ( YOUR_QUERY_GOES_HERE -- including the order by ) a
where rownum <= MAX_ROWS )
where rnum >= MIN_ROWS
Saludos.

--- El mar 28-abr-09, Favio DeMarco <fav...@gmail.com> escribió:

De:: Favio DeMarco <fav...@gmail.com>
Asunto: [JavaSOS] Re: Consulta de mas de 50 mil registros
A: jav...@googlegroups.com
Fecha: martes 28 de abril de 2009, 16:30


Core J2EE Patterns - Value List Handler
http://java.sun.com/blueprints/corej2eepatterns/Patterns/ValueListHandler.html
http://java.sun.com/blueprints/patterns/ValueListHandler.html

Pagination using JDBC and JSP
http://www.javaranch.com/journal/2008/08/pagination-using-JDBC-and-JSP.html

The VM prints "OutOfMemoryError" and exits. Increasing max heap size
doesn't help. What's going on?
http://java.sun.com/docs/hotspot/HotSpotFAQ.html#gc_oom

17.1.2 Oracle JDBC Implementation Overview for Result Set Enhancements
http://download-east.oracle.com/docs/cd/B14117_01/java.101/b10979/resltset.htm#sthref1523

2009/4/28 William Diaz Pabón <wid...@gmail.com>:
> Buenas tardes.
>
> Necesito hacer una consulta pero me da el siguiente error: Caused by:
> java.lang.OutOfMemoryError: Java heap space
>
> Se le acaba la memoria de la maquina virtual de java porque la consulta
> deberia retornar 50349 registros.
>
> Como hago para ejecutar la consulta pero de 100 en 100 registros para no
> colgar a la maquina virtual?
>
> Yo uso jdk 1.5.14, Spring 1.3.8 + Oracle



¡Obtén la mejor experiencia en la web!
Descarga gratis el nuevo Internet Explorer 8.br> http://downloads.yahoo.com/ieak8/?l=mx

Octavio Nuñez

unread,
Apr 28, 2009, 6:05:51 PM4/28/09
to jav...@googlegroups.com
hola, te recomiendo utilizar la utima vercion de java... jdk1.6.0_13

yo la utilizo com oracle 10g y apache tomcat, y me funciona a la perfeccón

Saludos

2009/4/28 Favio DeMarco <fav...@gmail.com>


Core J2EE Patterns - Value List Handler
http://java.sun.com/blueprints/corej2eepatterns/Patterns/ValueListHandler.html
http://java.sun.com/blueprints/patterns/ValueListHandler.html

Pagination using JDBC and JSP
http://www.javaranch.com/journal/2008/08/pagination-using-JDBC-and-JSP.html

The VM prints "OutOfMemoryError" and exits. Increasing max heap size
doesn't help. What's going on?
http://java.sun.com/docs/hotspot/HotSpotFAQ.html#gc_oom

17.1.2 Oracle JDBC Implementation Overview for Result Set Enhancements
http://download-east.oracle.com/docs/cd/B14117_01/java.101/b10979/resltset.htm#sthref1523

2009/4/28 William Diaz Pabón <wid...@gmail.com>:
> Buenas tardes.
>
> Necesito hacer una consulta pero me da el siguiente error: Caused by:
> java.lang.OutOfMemoryError: Java heap space
>
> Se le acaba la memoria de la maquina virtual de java porque la consulta
> deberia retornar 50349 registros.
>
> Como hago para ejecutar la consulta pero de 100 en 100 registros para no
> colgar a la maquina virtual?
>
> Yo uso jdk 1.5.14, Spring 1.3.8 + Oracle





--
Octavio E. Núñez R.
Desarrollador de Software, Soporte Técnico y Seguridad Informática
JSP, Java, PHP, Jscript, Apache & Tomcat Server, MySQL Server, HTML, C++
enriqu...@hotmail.com - enriqu...@yahoo.com - enriqu...@gmail.com
251-6104 - 211-0441 - 6621-5790 -ICQ  157-246-843
Reply all
Reply to author
Forward
Message has been deleted
0 new messages