Implementando um cache de dados simples em Delphi
Evitar ao máximo consultas com o banco de dados pode ser uma excelente forma de aumentar a performance da aplicação.
Grande parte dos softwares desenvolvidos hoje em dia adotam a arquitetura cliente/servidor. Isto significa que uma requisição do cliente implica em uma viagem de ida e volta até o servidor (round trip). Na pior das hipóteses, isto se traduz em um novo Open na conexão com o banco de dados, uma nova autenticação e um número infinito de controles e verificações relacionadas ao protocolo em questão, requisitos de segurança, etc, etc, etc.
Resumidamente, quando for possível evitar o acesso remoto para obter alguma informação, não deixe para depois.
O exemplo que segue abaixo implementa um cache de dados simples utilizando um objeto da classe TStringList do Delphi. Eu uso muito esta técnica em relatórios onde, por exemplo, preciso retornar uma série de informações sobre uma lista de registros mas não posso fazer isto diretamente na query enviada ao banco (seja por questões técnicas, pois utilizamos o MySQL 3.x, ou de legibilidade).

Tipo TObj utilizado na implementação do cache

Função que implementa o uso do cache
Esta função funciona da seguinte maneira:
- Recebe o código de um produto qualquer para retornar o seu valor cadastrado na base;
- Verifica se este valor já foi retornado anteriormente. Se foi, não há motivos para buscar do banco, então retorna da lista que está armazenada localmente;
- Se ainda não foi retornado, então busca do banco e armazena no cache.
Claro que esta abordagem é inviável para determinadas situações. Você não pode generalizar e usar este cache para todas os casos, pois imagine que você tenha localmente todos os valores dos produtos e alguém, de outra máquina conectada ao banco, faz uma alteração em um destes valores. Neste caso, o que você tem localmente já não reflete mais o que está armazenado no banco e, portanto, estará trabalhando com valores desatualizados. Se você for fazer algum lançamento de estoque onde envolva valores, por exemplo, estará realizando uma operação incorreta que prejudicará mais adiante em uma consulta de movimentação de produtos.
Em relatórios, sempre que o usuário pede para exibir as informações eu costumo limpar o cache (utilizando FCacheValores.Clear) para garantir que, caso entre a geração de um relatório e outro o valor do banco tenha mudado, eu esteja com os dados atualizados localmente. Veja um exemplo de uso desta função:

Função que implementa o uso do cache
É isso ae. Adapte esta idéia à sua situação.
Até +




Deixe o seu comentário