Estou com uma dúvida aqui e gostaria do apoio de vocês. Estou desenvolvendo um sistema para a loja de minha tia.
Estou usando JPA 2 + Hibernate em um banco de dados mySQL.
Quando o programa é iniciado, salvo todos os dados do Banco de Dados em listas do tipo List<>.
Então, em tese, não se torna necessário que eu fique abrindo a conexão com o Banco de Dados toda vez que for fazer uma pesquisa, uma vez que os dados estão nas listas.
Gostaria de saber se é melhor realizar as buscas de algum item da lista, ou se faço as pesquisas do Banco de Dados?
Qual é menos custoso ao sistema?
Acessar algum dado em Memória é sempre mais rápido do que no BD, pois é acesso Físico, no HD.
Porém o que você faz ao iniciar sua aplicação, armazenando os dados do BD em memória para serem utilizados, é ignorar quaisquer atualizações de dados no BD (novos INSERT, UPDATE ou DELETE). Para uma loja, acredito que esta não seja uma estratégia válida. (Aliás acredito que seta não seja uma estratégia válida para 95% dos sistemas por aí 8-/ )
Então, sempre que realizo alguma alteração em meu BD, sempre atualizo a Lista que está salva na memória. Para isso, criei uma classe chamada Utils(), onde salvo todas as listas, e sempre que alguma das listas é atualizada, chamo o método que atualiza a lista na memória.
Assim é melhor ou o melhor seria ficar buscando sempre no BD. Estou usando Hibernate + JPA.
Então, sempre que realizo alguma alteração em meu BD, sempre atualizo a Lista que está salva na memória. Para isso, criei uma classe chamada Utils(), onde salvo todas as listas, e sempre que alguma das listas é atualizada, chamo o método que atualiza a lista na memória.
Assim é melhor ou o melhor seria ficar buscando sempre no BD. Estou usando Hibernate + JPA.
Obrigado.[/quote]
Você só está reiventando a roda …
Isso que você fez chama-se cache, que podem ser tão triviais quanto uma HashMap ou podem ser mais sofisticadas de acordo com os requisitos de disponibilidade, distribuição, concorrência, etc.
O Hibernate já implementa um cache pra você. Ao criar uma sessão por exemplo, todas as entidades carregadas durante aquela sessão são mantidas em cache (1o nível), e opcionalmente, você pode habilitar o cache de 2o nível que é comum a todas as sessões abertas:
Resumindo, você pode escrever sua lógica de negócio como se você pesquisasse o BD sempre, e configurar o seu Hibernate ou outro ORM para fazer cache se necessário.
Em tempo, listas são estruturas de dados inadequadas para manter cache. Porque a economia que você faria com I/O você gastaria novamente com buscas em tempo linear na memória.