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.
Achas que alguém vai olhar para uma tabela com 4 milhões de registos?
J
jeanmalvessi
Caramba, é realmente necessário resgatar todos os registros ? :shock:
J
JuniorMaia
JTable já é básica, com 4 milhões registros vira uma porcaria! ;x
L
Luiz_Augusto_Prado
vai ter que criar uma paginação. É o melhor a fazer.
G
Gleidson_Henrique
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
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.
G
Gleidson_Henrique
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
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.
Obrigado amigo, vou dar uma lida para me informar referente a isso…
Abraços
E
Eduardo_Nunes
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
juliocbq
-’ 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
jeanmalvessi
A fim de curiosidade, esta tabela de 4 milhões de registros armazena o que ?
J
JuniorMaia
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
Gleidson_Henrique
Mas isso nao agilizará, apenas vai mudar o modo como voce pega as informações no db…
E
Eduardo_Nunes
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
Eduardo_Nunes
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
JuniorMaia
e quanto tempo leva para listar todos?
S
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…
E
Eduardo_Nunes
se for pra listar todos não lista!!!
E
Eduardo_Nunes
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
marcospaulo.suporte
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
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.
E
Eduardo_Nunes
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
Luiz_Augusto_Prado
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:
intinicio=2;intfim=4;Stringquery="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.