Carregar GRANDE volume de dados em um JTable

24 respostas
E

Pessoal Boa Tarde, estou com um problema de memória ao carregar uma tabela do meu banco MySQL para uma JTtable.
A tabela possui 3.929.751 de linhas e 15 colunas e quase 600Mb de registros.
com os testes que fiz ví que a consulta é realizada em um tempo aceitável, mas na hora de mostrar acontece o problema.

Alguem tem alguma solução?

24 Respostas

P

Achas que alguém vai olhar para uma tabela com 4 milhões de registos?

J

Caramba, é realmente necessário resgatar todos os registros ? :shock:

J

JTable já é básica, com 4 milhões registros vira uma porcaria! ;x

L

vai ter que criar uma paginação. É o melhor a fazer.

G

Em desktop existe alguma coisa que permite fazer isso facilmente? Ou tem que implementar isso na unha mesmo?

Uma ideia que dou para o amigo é colocar um campo para pesquisar, assim ficará mais fácil encontrar o que querem e não irá travar.

Abraços

E

Bom, na verdade possui os filtros de busca já, mas minha dúvida é: tem como acelerar a consulta? mudar a Jtable abstractTableModel ou defaultTableModel agilizaria mais?
estou fazendo uns teste aqui.

G

Eduardo_Nunes:
Bom, na verdade possui os filtros de busca já, mas minha dúvida é: tem como acelerar a consulta? mudar a Jtable abstractTableModel ou defaultTableModel agilizaria mais?
estou fazendo uns teste aqui.

O seu programa está travando até carregar toda a lista? Caso for, implemente Threads…

Não sei se mudar o model irá agilizar drasticamente para esse tanto de registro…

Abraços

L

Gleidson Henrique:
Luiz Augusto Prado:

vai ter que criar uma paginação. É o melhor a fazer.

Em desktop existe alguma coisa que permite fazer isso facilmente? Ou tem que implementar isso na unha mesmo?

Uma ideia que dou para o amigo é colocar um campo para pesquisar, assim ficará mais fácil encontrar o que querem e não irá travar.

Abraços

eu digite no google JTable + paginação e apareceu esse resultado:
http://markytechs.wordpress.com/tag/jtable/

Acho que esse site é de um dos membros do forum.

G

Luiz Augusto Prado:
Gleidson Henrique:
Luiz Augusto Prado:

vai ter que criar uma paginação. É o melhor a fazer.

Em desktop existe alguma coisa que permite fazer isso facilmente? Ou tem que implementar isso na unha mesmo?

Uma ideia que dou para o amigo é colocar um campo para pesquisar, assim ficará mais fácil encontrar o que querem e não irá travar.

Abraços

eu digite no google JTable + paginação e apareceu esse resultado:
http://markytechs.wordpress.com/tag/jtable/

Acho que esse site é de um dos membros do forum.

Obrigado amigo, vou dar uma lida para me informar referente a isso…

Abraços

E

Estava usando Statement e vi que o PreparedStatement é melhor, pensei em usar Hibernate mas como preciso de mais agilidade acho que o Hibernate nesse caso não será útil

J
  • -’ Não existe componente de gui e que aguente uma carga dessas. Faz a conta, cada char ocupa 2 bytes (2 * 4.000.000)/1024 = 7,8 mb no mínimo(imaginei cada registro com um caracter).
J

A fim de curiosidade, esta tabela de 4 milhões de registros armazena o que ?

J

realmente eu acho que imprimir na tela 4 milhões de registros seria desnecessário, o cara iria demorar um tempão para procurar algum dado, fora que a performance cairia muito, se esses dados realemnte prcisam ser impressos na visão e na tabela, você terá que aplicar formas mais ágeis, usar uma AbstractTable, troca statement pelo prepared, e concordo que um hibernate na sua aplicação não mudaria nada. Mas me diz uma coisa, quanto tempo levou para listar todos esses dados na tabela? Travou? Explica melhor isso, nunca testei e nunca vi uma aplicação java lidando com tantos registros assim…

G

Mas isso nao agilizará, apenas vai mudar o modo como voce pega as informações no db…

E

pois é cara tem vários filtros de busca que acelera a consulta, mas eu queria saber se fosse mostrar todos de uma vez teria como!!!
mas é inviável dessa forma!

E

Também acho desnecessário mostrar todos os registros, até porque minha máquina não tem memória sufuciente pra isso!! ela trava sempre.
o preparedStatement é bem melhor ja modifiquei o código e melhorou bastante, como o programa ainda é um “protótipo” em desenvolvimento estou fazendo vários testes e modificando sempre buscando mais agilidade.

Essa tabela possui registro de produtos de um grupo de empresas! e essas quase 4 milhoes são de apenas 2 grupos!!!

J

e quanto tempo leva para listar todos?

S

Nossa… para que todos? Claro que tem que paginar… joga os objetos resultados da busca em cache e vai jogando para um grupo limitado de transfer objects para mostrar na tela… aí é rapidinho… só o tempo do BD que fica lento…

… se for sistema distribuído, mantenha o BD perto do domínio…

E

se for pra listar todos não lista!!!

E

Scratsh:
Nossa… para que todos? Claro que tem que paginar… joga os objetos resultados da busca em cache e vai jogando para um grupo limitado de transfer objects para mostrar na tela… aí é rapidinho… só o tempo do BD que fica lento…

… se for sistema distribuído, mantenha o BD perto do domínio…

minha idéia é um pouco parecida…
eu vou fazendo a consulta e inserindo em uma árvore, e depois pego por chave.

mas por enquando os filtros de pesquisa estão se virando!!!

Criei este tópico para saber de que forma posso agilizar minhas consultas.
Vocês ja me deram muitas idéias, que estão sendo implementadas.

M

Amigo;
Não pode trazer os ultimos 1000 registros??

“Select top(1000) * from” ou 10.000 ou até 100.000, por que dai vc exibe o que quer lá dentro e adiciona um filtro para o usuario… pra nao ficar tao pesado…

I


minha idéia é um pouco parecida…
eu vou fazendo a consulta e inserindo em uma árvore, e depois pego por chave.
mas por enquando os filtros de pesquisa estão se virando!!!
Criei este tópico para saber de que forma posso agilizar minhas consultas.
Vocês ja me deram muitas idéias, que estão sendo implementadas.

Eduardo, pouco tempo atrás tive o mesmo problema que você, sendo que a diferença é que eram 100mil linhas na JTable e o banco era Oracle.Resolvi com rownum e aqueles velhos botões de first,next,previous e last.Use LIMIT e seja feliz.

E

Ironlynx:

minha idéia é um pouco parecida…
eu vou fazendo a consulta e inserindo em uma árvore, e depois pego por chave.
mas por enquando os filtros de pesquisa estão se virando!!!
Criei este tópico para saber de que forma posso agilizar minhas consultas.
Vocês ja me deram muitas idéias, que estão sendo implementadas.

Eduardo, pouco tempo atrás tive o mesmo problema que você, sendo que a diferença é que eram 100mil linhas na JTable e o banco era Oracle.Resolvi com rownum e aqueles velhos botões de first,next,previous e last.Use LIMIT e seja feliz.

estou usando!!! :lol:

L

Tava com uma dúvida sobre paginação utilizando o apache derby e achei esse código.
Esse SQL pode ajudar outros tiverem interesse sobre paginação:

int inicio = 2;
            int fim = 4;
            String query = "SELECT * FROM ( SELECT  ROW_NUMBER() OVER () AS R, pessoa.* FROM pessoa where nome like '%a%' ) "
            // mostra de linha numero 2 a linha numero 4 
            + "AS TR WHERE R >"+inicio+" and R<="+fim;

para cada págia a ser mostrada deve-se incrementar inicio e fim. Nesse caso só irá mostrar 2 resultados de cada vez.
No exemplo utilizo uma filtragem com like, mas poderia ser qualquer outra.

Com esse tipo de consulta, permite-se que um bancos de dados embedded responda à alguns clientes.

Criado 18 de setembro de 2012
Ultima resposta 28 de set. de 2012
Respostas 24
Participantes 10